0 Numpy簡單介紹
Numpy是Python的一個科學計算的庫,提供了矩陣運算的功能,其一般與Scipy、matplotlib一起使用。其實,list已經提供了類似於矩陣的表示形式,不過numpy為我們提供了更多的函數。如果接觸過matlab、scilab,那么numpy很好入手。
NumPy函數庫中存在兩種不同的數據類型(矩陣matrix和數組array),都可以用於處理行列表示的數字元素。調用mat()函數可以將數組轉化為矩陣,輸入命令如下:
np.mat(np.random.rand(1,4))
1 安裝
pip install numpy
在NumPy中,維度稱之為axis
(復數是axes
),維度的數量稱之為rank
。
(通用做法import numpu as np 簡單輸入)
2 多維數組
NumPy的數組類是ndarray
,它有一個別名是 numpy.array
,但這與Python標准庫的array.array
並不一樣。后者僅僅是一個一維數組。而ndarray
具有以下的屬性:
ndarray.ndim
:數組的維數。在Python世界中,維數稱之為rank
ndarray.shape
:數組的維度。這是一系列數字,長度由數組的維度(ndim
)決定。例如:長度為n的一維數組的shape
是n。一個n行m列的矩陣的shape
是n,mndarray.size
:數組中所有元素的數量ndarray.dtype
:數組中元素的類型,例如numpy.int32
,numpy.int16
或者numpy.float64
ndarray.itemsize
:數組中每個元素的大小,單位為字節ndarray.data
:存儲數組元素的緩沖。通常我們只需要通過下標來訪問元素,而不需要訪問緩沖
以list或tuple變量為參數產生一維數組:
np.array([1,2,3,4])
np.array((1.2,2,3,4))
以list或tuple變量為元素產生二維數組或者多維數組:
np.array(((1,2,3),(4,5,6)))
np.array([[1,2,3],[4,5,6]])
我們也可以在創建數組的時候,指定元素的類型,例如這樣:
np.array([[1,2],[3,4]], dtype=complex )
可以使用astype轉換類型,在處理文件時候這個會很實用,注意astype 調用會返回一個新的數組,也就是原始數據的一份拷貝。
numeric_strings2 = np.array(['1.23','2.34','3.45'],dtype=np.string_) print(numeric_strings2) [b'1.23' b'2.34' b'3.45'] t=numeric_strings2.astype(float) print(t) [ 1.23 2.34 3.45]
3 numpy索引(index)與切片(slicing)
- index 和slicing :第一數值類似數組橫坐標,第二個為縱坐標;
x=np.array(((1,2,3,4),(5,6,7,8),(9,10,11,12))) y=x[:,1] y[0]=20 print(y) print(x)
結果:
通過上面可以發現改變y會改變x ,因而我們可以推斷,y和x指向是同一塊內存空間值,系統沒有為y 新開辟空間把x值賦值過去。
arr = np.arange(10) arr[3:6]=10 print(arr)
結果:
思考為什么這么設計? Numpy 設計是為了處理大數據,如果切片采用數據復制話會產生極大的性能和內存消耗問題。
- 假如說需要對數組是一份副本而不是視圖可以如下操作:
arr = np.arange(10) arr_copy = arr[3:6].copy() print(arr_copy) arr_copy[:]=24 print(arr_copy) print(arr)
結果:
- 再看下對list 切片修改(這里設計到python 中深淺拷貝,其中切片屬於淺拷貝):
l=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] l[5:8] = 12 #報錯 TypeError: can only assign an iterable print(l) l1= l[5:8] print(l1) l1[0]=12 print(l1) print(l)
結果:
4 多維數組索引(index)、切片(slicing)
arr2d = np.arange(1,10).reshape(3,3) print(arr2d) print(arr2d[2]) print(arr2d[0][2]) print(arr2d[0,2])
結果:
5 基本的矩陣運算
轉置:
a = np.array([[1,0],[2,3]]) print(a) print() print(a.transpose())
結果:
特征值、特征向量:
6 Shape與操作
除了生成數組之外,當我們已經持有某個數據之后,我們可能會需要根據已有數組來產生一些新的數據結構,這時候我們可以使用下面這些函數:
reshape
:根據已有數組和指定的shape,生成一個新的數組vstack
:用來將多個數組在垂直(v代表vertical)方向拼接(數組的維度必須匹配)hstack
:用來將多個數組在水平(h代表horizontal)方向拼接(數組的維度必須匹配)hsplit
:用來將數組在水平方向拆分vsplit
:用來將數組在垂直方向拆分
7 特定array的創建
在實際上的項目工程中,我們常常會需要一些特定的數據,NumPy中提供了這么一些輔助函數:
zeros
:用來創建元素全部是0的數組ones
:用來創建元素全部是1的數組empty
:用來創建未初始化的數據,因此是內容是不確定的arange
:通過指定范圍和步長來創建數組linespace
:通過指定范圍和元素數量來創建數組random
:用來生成隨機數
參考: