Numpy
ndarray
numpy的最重要特點就是其N維數組對象(ndarray)。
ndarray的可以對整塊數據執行數學運算,語法與標量元素的元素的運算一致。
如:
import numpy as np
x = array([[-0.50043612, -1.99790499, 0.66098891, 0.26490388],
[-1.02531769, 0.50054972, -1.30755871, 1.53881345]])
x + x #相加
Out[10]:
array([[-1.00087224, -3.99580998, 1.32197782, 0.52980775],
[-2.05063538, 1.00109944, -2.61511741, 3.0776269 ]])
x * 10 #乘以標量
Out[11]:
array([[ -5.0043612 , -19.97904992, 6.60988909, 2.64903877],
[-10.25317691, 5.00549718, -13.07558707, 15.38813451]])
1 / x #1/x被除
Out[5]:
array([[-1.99825704, -0.5005243 , 1.51288469, 3.77495415],
[-0.97530747, 1.99780353, -0.76478401, 0.64985135]])
x - x #相減
Out[12]:
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
- shape查詢數組維度
- ndim數組的維數
- dtype查詢數組數據類型
x.shape
Out[13]: (2, 4) # 2行4列
x.ndim
Out[15]: 2 # 2維
x.dtype
Out[14]: dtype('float64') #數據類型
創建ndarray
1. array函數
將輸入數據(列表,元組,數組,或其他),轉換為ndarray
y = list(range(1,11)) #如果直接輸入y = range(1,11),會返回一個迭代器。
y
Out[33]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
arr1 = np.array(y)
arr1
Out[35]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
z = [[1, 2, 3, 4],[5, 6, 7, 8]]# 生成一個嵌套序列(一組等長列表組成的列表)
arr2 = np.array(z)
arr2
Out[44]:
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
2. asarray函數
將輸入轉換為ndarray,若本身是ndarray則不復制。
3. arange函數
arange()是python內置函數range()的數組版。
arange()生成一個一維數組,range生成列表。
np.arange(11) #可對比上文的range理解。
Out[45]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
4. ones,ones_like函數
這里必須說明一下,如果ndarray沒有指定數據類型,則默認為float64(浮點數)。
ones根據指定的形狀和dtype創建一個全1數組。
ones_like以另一個數組為參數,並根據其形狀和dtype創建一個全1數組。
np.ones(2) #默認一維
Out[46]: array([ 1., 1.])
np.ones((2,3))
Out[47]:
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
np.ones(3,dtype = np.int32) # 指定數據類型
Out[51]: array([1, 1, 1])
np.ones_like(arr2) #以arr2為參數
Out[54]:
array([[1, 1, 1, 1],
[1, 1, 1, 1]])
5. zeros,zeros_like函數
類似與ones,ones_like,但是創建的是全0數組。
6. empty,empty_like函數
創建新數組,分配內存空間,但不填充任何值。
np.empty(2)
Out[56]: array([ 0., 0.])
np.empty((2,4)) #2 * 4
Out[57]:
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
np.empty_like(arr2) #以arr2為參數
Out[60]:
array([[0, 0, 0, 0],
[0, 0, 0, 0]])
看到這里你是不是以為np.empty會返回全0數組?
其實不是的。
np.empty((3,3,2)) # 3維數組
Out[58]:
array([[[ 6.23042070e-307, 4.67296746e-307],
[ 1.69121096e-306, 1.33512376e-306],
[ 1.33511562e-306, 1.11256817e-306]],
[[ 1.06811422e-306, 1.42417221e-306],
[ 1.11260619e-306, 8.90094053e-307],
[ 1.86919378e-306, 1.06809792e-306]],
[[ 1.37962456e-306, 1.69111861e-306],
[ 1.78020169e-306, 1.37961777e-306],
[ 7.56599807e-307, 2.56761491e-312]]])
7. eye,identity函數
返回一個N介單位矩陣。
np.eye(5) # 創建5介單位陣
Out[61]:
array([[ 1., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 1.]])
np.identity(5) #創建5介單位陣
Out[63]:
array([[ 1., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 1.]])
eye(N, M = None, k = 0,dtype =float)
第一個參數N = 行數。
第二個參數 M = 列數,省略代表M = N 。
第三個參數 k 代表對角線位置, = 0 代表主對角線, +1就向右上方偏移1, -1 就向左下角偏移1。
第四個參數表示類型 dtype 默認為 float 類型。
np.eye(4,k = 1) #向上偏移
Out[69]:
array([[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.],
[ 0., 0., 0., 0.]])
np.eye(4,k = -1) #向下偏移
Out[70]:
array([[ 0., 0., 0., 0.],
[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.]])
np.eye(4,8) #給定M
Out[67]:
array([[ 1., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 1., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 1., 0., 0., 0., 0.]])
ndarray的數據類型
numpy所支持的數據類型如下:
| 數據類型 | 描述 |
|---|---|
| bool_ | 以字節存儲的布爾值(True 或 False) |
| int_ | 默認的整數類型(和 C 的 long 一樣,是 int64 或者 int32) |
| intc | 和 C 的 int 相同(一般為 int64 或 int32) |
| intp | 用於下標的整數(和 C 的 ssize_t 相同,一般為int64 或者 int32) |
| int8 | 字節(-128 到 127) |
| int16 | 整數(-32768 到 32767) |
| int32 | 整數(-2147483648 到 2147483647) |
| int64 | 整數(-9223372036854775808 到 9223372036854775807) |
| uint8 | 無符號整數(0 到 255) |
| uint16 | 無符號整數(0 到 65535) |
| uint32 | 無符號整數(0 到 4294967295) |
| uint64 | 無符號整數(0 到 18446744073709551615) |
| float_ | float64 的簡寫 |
| float16 | 半精度浮點:1位符號,5位指數,10位尾數 |
| float32 | 單精度浮點:1位符號,8位指數,23位尾數 |
| float64 | 雙精度浮點:1位符號,11位指數,52位尾數 |
| complex_ | complex128 的簡寫 |
| complex64 | 由兩個32位浮點(實部和虛部)組成的復數 |
| complex128 | 由兩個64位浮點(實部和虛部)組成的復數 |
| string_ | 固定長度的字符創類型(每個字符一個字節) |
很難記住這些numpy的dtype。我們只需要控制存儲類型即可。
arr1 = np.array([1, 2, 3],np.int32)
arr2 = np.array([2,3,4],dtype = np.float64)
arr1.dtype
Out[14]: dtype('int32')
arr2.dtype
Out[11]: dtype('float64')
.astype()方法可以顯式的轉換為dtype。
float_arr1 = arr1.astype(np.float64) #整型轉換為浮點型
float_arr1.dtype
Out[16]: dtype('float64')
float_arr1
Out[17]: array([ 1., 2., 3.])
浮點型轉換為整型,只保留整數部分。
arr3 = np.array([2.3, -1.32, -5.9, 4.8])
arr3
Out[25]: array([ 2.3 , -1.32, -5.9 , 4.8 ])
arr3.astype(np.int32)#轉換為整數
Out[26]: array([ 2, -1, -5, 4]) #可看到小數部分被丟棄了
有時某個字符串不能被轉換為float64,就會引發TypeError,因此,我們可以懶一點,
像下面這樣寫:
n_strings = np.array(['1.23','-9.6','23'],dtype = np.string_)
n_strings.astype(np.float)
Out[32]: array([ 1.25656565, -9.6 , 23. ])
n_strings.astype(np.float64)
Out[30]: array([ 1.25656565, -9.6 , 23. ])
n_strings
Out[35]:
array([b'1.256565653', b'-9.6', b'23'],
dtype='|S11')
可以看到這兩種結果一致。
numpy會將其數據類型映射到等價的dtype上。
可以發現,使用.astype()新創建了一個數組(原數組的一種拷貝),即使,與原來數據類型一致也會如此。
