1. 程式人生 > >python 標準庫:numpy使用一

python 標準庫:numpy使用一

從經典的101個numpy練習中總結:

1、numpy:

python拓展包,可以用於處理大型矩陣,有足夠的函式庫以及線性轉換函式,有許多高階的數值運算工具:

import numpy as np
print(np.__version__)

2、基礎操作:

numpy陣列類是numpy.array

其中有array.nidm矩陣的維度和,array.size:元素個數,array.dtype元素的型別,array.shape:陣列大小,array.itemsize:每個元素位元組的大小

建立矩陣:

建立一定範圍的一維矩陣:arr=np.arange(10),用法類似range(),有三個引數,第一個是起點第二個是終點,第三個是步長

查詢資料型別:array.dtype;轉換資料型別:array.astype();查詢維度:.ndim;查詢元素個數:.size

返回array型別等差矩陣,np.arange(1,10,2)。注意在步長是浮點數的時候,由於arange是有一定誤差的所以會產生累計,故使用linspace更好               

np.logspace(1,4,4,base=2,endpoint=True):生成一個等比數列。

還有一種建立一維矩陣的函式np.repeat(a,b):將a元素重複b次的一維陣列;注意a本身也可以是一個數組:

a = np.array([1,2,3])`
np.r_[np.repeat
(a,3), np.tile(a,3)]#> array([1, 1, 1, 2, 2, 2, 3, 3, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3])

建立一定維度的矩陣:np.full((2,3),5)     其中建立布林值矩陣的方法是:np.full((2,3),Ture,dtype=bool);或者是np.ones((2,3),dtype=bool);

其中np.ones()建立全為1的矩陣,np.zero()建立全為零的矩陣,np.empty()可以建立一個初始值受記憶體狀態影響的陣列,np.eye()可以輸出單位陣,np.random.random()可以輸出任意大小元素的矩陣。注意這些元素型別均為float64

numpy.array()的基本運算以及生成函式:

7.np.array 的陣列切片
a.切片規則 [三冒號規則]
  [開始:結尾:步長]
b.開始為-1
  a[-1] 取最後一個
  a = [0,1,2,3,4,5,6,7]
  a[-1] = 7
c.結尾為-1(開始必須為大於等於0的數)
  a[2:-1] = [2,3,4,5,6]
d.步長為-1,意味著反轉

  a[::-1]=[7,6,5,4,3,2,1]

2、numpy列印方式:

np.set_printoptions(precision=3)就是設定輸出格式是三位小數

實現輸出將科學記數法變為幾位小數:np.set_printoptions(suppress=True, precision=6)

設定輸出範圍:np.set_printoptions(threshold=6):只輸出前後的六個元素;np.set_printoptions(threshold=np.nan):全部輸出

a[:]列印全部,a[:b]列印到b的元素,a[b:]列印從b開始的元素

注意,np.array.reshape()可以將arange矩陣大小reshap:

numpy庫函式:reshape()的引數:reshape(a,newshape,order='C')

a:array_like;newshape:新形成的陣列的維度必須與之前的相容,而且不能改變原有的元素值,維度可以是-1;order={‘A’,'C','F'},控制索引方式;

注意:通過reshape生成的新陣列和原始陣列公用一個記憶體,也就是說,假如更改一個數組的元素,另一個數組也將發生改變

特別注意陣列新的shape屬性應該要與原來的配套,如果等於-1的話,那麼Numpy會根據剩下的維度計算出陣列的另外一個shape屬性值。

 舉幾個例子或許就清楚了,有一個數組z,它的shape屬性是(4, 4)

z = np.array([[1, 2, 3, 4],
          [5, 6, 7, 8],
          [9, 10, 11, 12],
          [13, 14, 15, 16]])
z.shape
(4, 4)
z.reshape(-1)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16])
#z.reshape(-1, 1)也就是說,先前我們不知道z的shape屬性是多少,但是想讓z變成只有一列,行數不知道多少,通過`z.reshape(-1,1)`,Numpy自動計算出有12行,新的陣列shape屬性為(16, 1),與原來的(4, 4)配套。z.reshape(-1,1)
array([[ 1],
        [ 2],
        [ 3],
        [ 4],
        [ 5],
        [ 6],
        [ 7],
        [ 8],
        [ 9],
        [10],
        [11],
        [12],
        [13],
        [14],
        [15],
        [16]])
 
#z.reshape(-1, 2)newshape等於-1,列數等於2,行數未知,reshape後的shape等於(8, 2)
z.reshape(-1, 2)
array([[ 1,  2],
        [ 3,  4],
        [ 5,  6],
        [ 7,  8],
        [ 9, 10],
        [11, 12],
        [13, 14],
        [15, 16]])

即只要給定newshape=-1,numpy就會根據陣列元素數目和提供的行數與列數(如果沒有預設是一行)去判斷reshape的行數與列數。

3、運算:陣列的算數運算適用於元素方式,即運算執行在每個元素上:不同於其他矩陣運算,在numpy陣列中,*乘法運算子操作與每個元素。而矩陣的乘積可以使用dot函式或dot方法執行:如+=、*=等操作符,在操作執行的地方替代陣列元素而不是產生新的陣列

若運算的陣列時不同的資料型,則遵循向上轉型,即結果陣列的元素型別為更一般或更精確的資料型別:

>>> a = np.ones(3, dtype=np.int32)
>>> b = np.linspace(0,pi,3)
>>> b.dtype.name
'float64'
>>> c = a+b
>>> c
array([ 1.        ,  2.57079633,  4.14159265])
>>> c.dtype.name
'float64'

4、陣列運算、新增以及判斷常用函式:

arr[arr%2==1]=-1;

np.where( , x,y);第一個引數是判斷條件,第二個是條件為True的輸出值,第三個是條件為False的輸出值:np.where不會覆蓋原有的陣列;np。where返回一個元素是int64的陣列,代表原陣列的滿足條件的元素的index,可以直接通過a[index]引用。

np.concatenate([a, b], axis=0):將a、b兩個陣列相拼接,axis是軸屬性,0是列拼接,1是行拼接,必須有相應相等的行與列;

也可以用 np.vstack([a,b])與np.r_[a,b]進行列拼接;np.hstack([a,b])與np.c_[a,b]進行行拼接。用np.hsplit(a, 3) 和 np.hsplit(a, (3, 4))等方法進行列分割;用 np.vsplit(a, 3) 和 np.vsplit(a, (3, 4))進行行分割

np.setdiff1d(a,b):從a中去除b中存在的元素;

np.logical_and(a>=5, a<=10):在numpy中不能用連不等號,但是可以用np.logical_and()表示邏輯和;

np.setdiff1d(np.where(np.logical_and(a>=5,a<=10),a,1),([1])):輸出滿足條件的元素的陣列

np.vectorize(max,otyeps=[float]):將一個標量函式轉換成一個向量函式的方法。。。。雖然我也不清楚這個函式到底怎麼用

a[:,[1,0,2]]改變原來二維陣列的列,新列的index在最後一個數組中;arr[[1,0,2],:]改變原來二維陣列的行,新行的index在最後一個數組中。當index的引數值是-1時,預設將行(或列)倒序a[:,::-1],a[::-1]

5*np.random.random(15).reshape(5,3)+np.repeat(5,15).reshape(5,3):產生在5到10之間的隨機二維陣列;也可以用一下程式碼實現

np.random.randint(low=5, high=10, size=(5,3))+ np.random.random((5,3))

np.genfromtxt():

    genfromtxt函式建立陣列表格資料

    genfromtxt主要執行兩個迴圈運算。第一個迴圈將檔案的每一行轉換成字串序列。第二個迴圈將每個字串序列轉換為相      應的資料型別。

    genfromtxt能夠考慮缺失的資料,但其他更快和更簡單的函式像loadtxt不能考慮缺失值

    genfromtxt唯一的強制引數是資料的來源。它可以是一個對應於一個本地或遠端檔案的名字字串,或一個有read方法的file- like物件(如一個實際的檔案或StringIO。StringIO物件)。如果引數是一個遠端檔案的URL,後者在當前目錄中自動下載。輸入檔案 可以是一個文字檔案或存檔,目前,該函式識別gzip和bz2(bzip2)。歸檔檔案的型別是檢查檔案的擴充套件:如果檔名以“.gz”結尾”,gzip存檔;如果它結尾是“bz2”,bzip2存檔。其中delimiter是分隔符型別

5.python矩陣運算表示式:

1.陣列的相加,相當的隨意,不用一樣的行和列:

  a = np.array([1,2,3,4,5])

  b = a.reshape(-1,1)

  a+b 返回的是一個 5*5 的矩陣

其結果是一個數組所有行加上另一個數組的所有行,一個數組的所有列,加上另一個數組的所有列。返回兩者之間最大行與最大列的矩陣。

 2.陣列的乘積可以直接相乘,是對應位相乘,陣列的求冪使用**。陣列可以求轉置,也是array.T,但是不能求逆

a.dot(b)、np.dot(a,b)是矩陣乘法

元素求e的冪:np.exp(array);元素開根號:np.sqrt(array)

3.幾個基本的函式:array.max(),array.min(),array.mean(),array.sum()

array.floor()向下取整;array.ravel()平坦化;

其中引數axis=1為行,axis=0為列

4.陣列複製:

淺複製:.view()

# The view method creates a new array object that looks at the same data.

import numpy as np
a = np.arange(12)
b = a.view() # b是新創建出來的陣列,但是b和a共享資料

b is a # 判斷b是a?
# 輸出 False
print (b)
# 輸出 [ 0  1  2  3  4  5  6  7  8  9 10 11]
b.shape = 2, 6 # 改變b的shape,a的shape不會受影響
print (a.shape)
print (b)
# 輸出 (12,)
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
b[0, 4] = 1234 # 改變b第1行第5列元素為1234,a對應位置元素受到影響
print (b)
# 輸出 [[   0    1    2    3 1234    5]
         [   6    7    8    9   10   11]]
print (a)
# 輸出 [   0    1    2    3 1234    5    6    7    8    9   10   11]

深複製 : .copy()

# The copy method makes a complete copy of the array and its data.

import numpy as np
a = np.arange(12)
a.shape = 3, 4
a[1, 0] = 1234

c = a.copy()
c is a
c[0, 0] = 9999 # 改變c元素的值,不會影響a的元素
print (c)
print (a)
# 輸出 [[9999    1    2    3]
 [1234    5    6    7]
 [   8    9   10   11]]
[[   0    1    2    3]
 [1234    5    6    7]
 [   8    9   10   11]]

5.利用==判斷陣列或矩陣中是否存在某個值:


6.將判斷結果賦給某個變數

7.一次判斷多個條件


8.矩陣的運算:  

a = np.matrix(np.array([[1,2,3],[2,1,3]]));

加法行列必須相同;對應元素相乘用 multiple ,矩陣相乘可直接寫,但行和列要相等

matrix.T 表示轉置 matrix.I 表示逆矩陣

9、矩陣物件的屬性:

>>> m[0]                #取一行
matrix([[1, 2, 3]])
>>> m[0,1]              #第一行,第2個數據
2
>>> m[0][1]             #注意不能像陣列那樣取值了
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/site-packages/numpy/matrixlib/defmatrix.py", line 305, in __getitem__
    out = N.ndarray.__getitem__(self, index)
IndexError: index 1 is out of bounds for axis 0 with size 1
#排序
>>> m=mat([[2,5,1],[4,6,2]])    #建立2行3列矩陣
>>> m
matrix([[2, 5, 1],
        [4, 6, 2]])
>>> m.sort()                    #對每一行進行排序
>>> m
matrix([[1, 2, 5],
        [2, 4, 6]])

>>> m.shape                     #獲得矩陣的行列數
(2, 3)
>>> m.shape[0]                  #獲得矩陣的行數
2
>>> m.shape[1]                  #獲得矩陣的列數
3

#索引取值
>>> m[1,:]                      #取得第一行的所有元素
matrix([[2, 4, 6]])
>>> m[1,0:1]                    #第一行第0個元素,注意左閉右開
matrix([[2]])
>>> m[1,0:3]
matrix([[2, 4, 6]])
>>> m[1,0:2]
matrix([[2, 4]])
#矩陣拓展:np.tile
x=np.matrix([1,2,3])
np.tile(x,(2,4))

matrix.T transpose:返回矩陣的轉置矩陣
matrix.H hermitian (conjugate) transpose:返回複數矩陣的共軛元素矩陣
matrix.I inverse:返回矩陣的逆矩陣
matrix.A base array:返回矩陣基於的陣列
矩陣物件的方法:
all([axis, out]) :沿給定的軸判斷矩陣所有元素是否為真(非0即為真)
any([axis, out]) :沿給定軸的方向判斷矩陣元素是否為真,只要一個元素為真則為真。
argmax([axis, out]) :沿給定軸的方向返回最大元素的索引(最大元素的位置).
argmin([axis, out]): 沿給定軸的方向返回最小元素的索引(最小元素的位置)
argsort([axis, kind, order]) :返回排序後的索引矩陣
astype(dtype[, order, casting, subok, copy]):將該矩陣資料複製,且資料型別為指定的資料型別
byteswap(inplace) Swap the bytes of the array elements
choose(choices[, out, mode]) :根據給定的索引得到一個新的資料矩陣(索引從choices給定)
clip(a_min, a_max[, out]) :返回新的矩陣,比給定元素大的元素為a_max,小的為a_min
compress(condition[, axis, out]) :返回滿足條件的矩陣
conj() :返回複數的共軛複數
conjugate() :返回所有複數的共軛複數元素
copy([order]) :複製一個矩陣並賦給另外一個物件,b=a.copy()
cumprod([axis, dtype, out]) :返回沿指定軸的元素累積矩陣
cumsum([axis, dtype, out]) :返回沿指定軸的元素累積和矩陣
diagonal([offset, axis1, axis2]) :返回矩陣中對角線的資料
dot(b[, out]) :兩個矩陣的點乘
dump(file) :將矩陣儲存為指定檔案,可以通過pickle.loads()或者numpy.loads()如:a.dump(‘d:\\a.txt’)
dumps() :將矩陣的資料轉存為字串.
fill(value) :將矩陣中的所有元素填充為指定的value
flatten([order]) :將矩陣轉化為一個一維的形式,但是還是matrix物件
getA() :返回自己,但是作為ndarray返回
getA1():返回一個扁平(一維)的陣列(ndarray)
getH() :返回自身的共軛複數轉置矩陣
getI() :返回本身的逆矩陣
getT() :返回本身的轉置矩陣
max([axis, out]) :返回指定軸的最大值
mean([axis, dtype, out]) :沿給定軸方向,返回其均值
min([axis, out]) :返回指定軸的最小值
nonzero() :返回非零元素的索引矩陣
prod([axis, dtype, out]) :返回指定軸方型上,矩陣元素的乘積.
ptp([axis, out]) :返回指定軸方向的最大值減去最小值.
put(indices, values[, mode]) :用給定的value替換矩陣本身給定索引(indices)位置的值
ravel([order]) :返回一個數組,該陣列是一維陣列或平陣列
repeat(repeats[, axis]) :重複矩陣中的元素,可以沿指定軸方向重複矩陣元素,repeats為重複次數
reshape(shape[, order]) :改變矩陣的大小,如:reshape([2,3])
resize(new_shape[, refcheck]) :改變該資料的尺寸大小
round([decimals, out]) :返回指定精度後的矩陣,指定的位數採用四捨五入,若為1,則保留一位小數
searchsorted(v[, side, sorter]) :搜尋V在矩陣中的索引位置
sort([axis, kind, order]) :對矩陣進行排序或者按軸的方向進行排序
squeeze([axis]) :移除長度為1的軸
std([axis, dtype, out, ddof]) :沿指定軸的方向,返回元素的標準差.
sum([axis, dtype, out]) :沿指定軸的方向,返回其元素的總和
swapaxes(axis1, axis2):交換兩個軸方向上的資料.
take(indices[, axis, out, mode]) :提取指定索引位置的資料,並以一維陣列或者矩陣返回(主要取決axis)
tofile(fid[, sep, format]) :將矩陣中的資料以二進位制寫入到檔案
tolist() :將矩陣轉化為列表形式
tostring([order]):將矩陣轉化為python的字串.
trace([offset, axis1, axis2, dtype, out]):返回對角線元素之和
transpose(*axes) :返回矩陣的轉置矩陣,不改變原有矩陣
var([axis, dtype, out, ddof]) :沿指定軸方向,返回矩陣元素的方差
view([dtype, type]) :生成一個相同資料,但是型別為指定新型別的矩陣。