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))