本文章僅供我本人學(xué)習(xí)記錄使用,不允許任何轉(zhuǎn)載及引用。特此聲明。
>>> Numpy是多維數(shù)組,通過ndarray對象(ndarray:sample1, sample2...)生成,可以有一維,二維,三維,四維。。。
In[1]: import numpy as np
In[2]: sample1 = np.array([1, 2, 3, 4])
In[3]: a1.shape
Out[3]: (4,)
#shape 獲取多維數(shù)組各個維度的大小,返回一個元組
#sample1是一維數(shù)組,大小為4
In[4]: sample1.size
Out[4]: 4
#size獲取數(shù)組的元素個數(shù)
In[5]: sample1.dtype
Out[5]: dtype('int64')
#dtype獲取數(shù)組內(nèi)元素的數(shù)據(jù)類型
In[6]: sample2 = np.array([[1.0, 2.5, 3], [0.5, 4, 9]])
In[7]: sample2.shape
Out[7]: (2, 3)
#sample2是一個2行,3列的二維數(shù)組(如excel)
In[8]: sample2.size
Out[8]: 6
In[9]: sample2.min()
Out[9]: 0.5
#min()返回元素中的最小元素
In[10]: sample2.dtype
Out[10]: dtype('float64')
In[11]: sample1
Out[11]: array([1, 2, 3, 4])
#sample1是一維數(shù)組
In[12]: sample2
Out[12]: array([[1. , 2.5, 3. ],
[0.5, 4. , 9. ]])
#sample2是二維數(shù)組
In[13]: type(sample1)
Out[13]: numpy.ndarray
# 其他更多方法可以輸入sample1.<tab>查看
>>> 除了上面使用np.array創(chuàng)建數(shù)組外,還有多種方法可以創(chuàng)建多位數(shù)組:
- np.arange,類似于range,創(chuàng)建一維數(shù)組;
- np.ones, 創(chuàng)建元素值全部是1的數(shù)組;
- np.zeros,創(chuàng)建元素值全部是0的數(shù)組;
- np.empty,創(chuàng)建空值的多位數(shù)組,只分配內(nèi)存,不填充任何值;
- np.random.random,創(chuàng)建元素值為隨機(jī)值的多位數(shù)組;
--- 以上全部函數(shù)都接受一個dtype參數(shù),用于指定多位數(shù)組元素的類型。在后面加上參數(shù)如:dtype = np.int64,當(dāng)沒有指定dtype時,默認(rèn)float64。
--- 后四個函數(shù)需要通過元組指定創(chuàng)建的數(shù)組形狀,比如(2, 3)指定創(chuàng)建數(shù)組為2行3列二維數(shù)組,或(3,4,2)創(chuàng)建一個三維數(shù)組,(2,5,4,4)創(chuàng)建一個思維數(shù)組。
--- 數(shù)組的維度可以通過sample2(ndarray).ndim獲取
如下:
In[1]: s1 = np.arange(4)
In[2]: s1
Out[2]: array([0, 1, 2, 3])
In[3]: s1.ndim
Out[3]: 1
In[4]: s2 = np.ones((4, 4), type = np.int64)
In[5]: s2
Out[5]:
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
In[6]: s2.dtype
Out[6]: dtype('int64')
In[7]: s2.ndim
Out[7]: 2
In[8]: s2.shape
Out[8]: (4, 4)
In[9]: s3 = np.zeros((2, 2))
In[10]: s3
Out[10]:
array([[0., 0.],
[0., 0.]])
In[11]: s3.dtype
Out[11]: dtype('float64')
In[12]: s4 = np.empty((3, 3), dtype = np.int64)
In[13]: s4
Out[13]:
array([[ 8070450532247928832, -2305834237023131736, 140355069542405],
[ 0, 0, 0],
[ 140355069597696, 140355069597696, 0]])
In[14]: s5 = np.ones((4, 3, 4))
In[15]: s5
Out[15]:
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])
In[16]: s5.ndim
Out[16]: 3
# ndarray對象還可以通過reshape方法變形為其他維度的數(shù)組:
In[17]: a = np.arange(12)
In[18]: a
Out[18]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
In[19]: a.reshape(4, 3)
Out[19]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
In[20]: a.reshape(2, 2, 3)
Out[20]:
array([[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]]])
>>> 多維數(shù)組索引:
使用‘:’切片選擇部分元素,如下:
In[1]: l = [1, 2, 3, 4, 5]
In[2]: l[:2]
Out[2]: [1, 2]
# 列表的前兩個元素
In[3]: l[2:4]
Out[3]: [3, 4]
# 列表的第3、第4個元素
In[4]: l[1:5:2]
Out[4]: [2, 4]
# 列表的第2到第5個元素,且步長為2(間隔1個元素)。
# 需要注意的是列表的索引從0開始,第一個索引是0,第二個索引是1。
In[5]: a = np.arange(12)
In[6]: a
Out[6]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
In[7]: a[1:4]
Out[7]: array([1, 2, 3])
In[8]: a[1:10:2]
Out[8]: array([1, 3, 5, 7, 9])
Numpy的列表切片比Python的要強(qiáng)大的多,因?yàn)橥ㄟ^切片,numpy可以進(jìn)行賦值操作,一次性改變數(shù)組中的多個元素:
In[1]: a = np.arange(12)
In[2]: a
Out[2]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
In[3]: a[1:5] = -1
Out[3]: array([ 0, -1, -1, -1, -1, 5, 6, 7, 8, 9, 10, 11])
In[4]: a[1:10:2] = 1
Out[4]: array([ 0, 1, -1, 1, -1, 1, 6, 1, 8, 1, 10, 11])
以上是一維數(shù)組切片,多維數(shù)組我們可以在每一個維度上進(jìn)行切片:
In[1]: a = np.arange(12).reshape(3, 4)
In[2]: a.shape
Out[2]: (3, 4)
In[3]: a
Out[3]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In[4]: a[0]
Out[4]: array([0, 1, 2, 3])
In[5]: a[1]
Out[5]: array([4, 5, 6, 7])
In[6]: a[:, 0]
Out[6]: array([0, 4, 8])
# 第一列元素
In[7]: a[:, 1]
Out[7]: array([1, 5, 9])
# 第二列元素
In[8]: a[0, 0]
Out[8]: 0
# a數(shù)組的第一行的第一列的元素
In[9]: a[0, 1]
Out[9]: 1
# a數(shù)組的第一行的第二列的元素
In[10]: a[1, 2]
Out[10]: 6
# a數(shù)組的第二行的第三列的元素
In[11]: a[0] = 1
Out[11]:
array([[ 1, 1, 1, 1],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In[12]: a[:, 1] = -1
Out[12]:
array([[ 1, -1, 1, 1],
[ 4, -1, 6, 7],
[ 8, -1, 10, 11]])
# 對于二維數(shù)組,可以通過a[x, y]的方式進(jìn)行索引;
# 對于三維數(shù)組,可以通過a[x, y, z]的方式進(jìn)行索引
另外,也可在高維數(shù)組上進(jìn)行降維索引:
In[1]: a
Out[1]:
array([[ 1, 1, 1, 1],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In[2]: a[1, 1]
Out[2]: 5
# 二維索引
In[3]: a[1]
Out[3]: array([4, 5, 6, 7])
# 二維數(shù)組的一維索引
# 三維數(shù)組的降維索引如下:
In[4]: a = np.arange(27).reshape(3, 3, 3)
Out[4]:
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]])
In[5]: a.ndim
Out[5]: 3
In[6]: a.shape
Out[6]: (3, 3, 3)
# a是三維數(shù)組,各維度大小是3,3,3
In[7]: a1 = a[1]
Out[7]:
array([[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]])
In[8]: a1.shape
Out[8]: (3, 3)
# a1是二維數(shù)組,各維度大小是3, 3
In[9]: a2 = a[1, 1]
Out[9]: array([12, 13, 14])
In[10]: a2.shape
Out[10]: (3,)
In[11]: a2.ndim
Out[11]: 1
# a2是一維數(shù)組,有3個元素
In[12]: a[2, 2, 2]
Out[12]: 26
# 定位三維數(shù)組中的一個元素
# 以下是同時修改每個維度中的特定行、列或一個元素:
In[13]: a[:, 1]
Out[13]:
array([[ 3, 4, 5],
[12, 13, 14],
[21, 22, 23]])
# 同時選擇所有第二維度上的元素,
# 以下是統(tǒng)一修改這個維度上的內(nèi)容
In[14]: a[:, 1] = 1
Out[14]:
array([[[ 0, 1, 2],
[ 1, 1, 1],
[ 6, 7, 8]],
[[ 9, 10, 11],
[ 1, 1, 1],
[15, 16, 17]],
[[18, 19, 20],
[ 1, 1, 1],
[24, 25, 26]]])
In[15]: a[:, 1] = ([1], [2], [3])
Out[15]:
array([[[ 0, 1, 2],
[ 1, 1, 1],
[ 6, 7, 8]],
[[ 9, 10, 11],
[ 2, 2, 2],
[15, 16, 17]],
[[18, 19, 20],
[ 3, 3, 3],
[24, 25, 26]]])
In[16]: a[:, 1] = [1, 2, 3]
Out[16]:
array([[[ 0, 1, 2],
[ 1, 2, 3],
[ 6, 7, 8]],
[[ 9, 10, 11],
[ 1, 2, 3],
[15, 16, 17]],
[[18, 19, 20],
[ 1, 2, 3],
[24, 25, 26]]])
>>> 多維數(shù)組的基本運(yùn)算:
在Python自帶的列表中,如果想讓所有元素都加上同一個數(shù),需要通過遍歷實(shí)現(xiàn),但在Numpy中則一場簡單:
In[1]: a = np.arange(12).reshape(3, 4)
In[2]: a
Out[2]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In[3]: a += 1
Out[3]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
# 所有元素翻倍:
In[4]: a *= 2
Out[4]:
array([[ 2, 4, 6, 8],
[10, 12, 14, 16],
[18, 20, 22, 24]])
# 多維數(shù)組間的運(yùn)算也非常簡單:
In[5]: a = np.arange(4).reshape(2, 2)
Out[5]:
array([[0, 1],
[2, 3]])
In[6]: b = np.arange(4, 8).reshape(2, 2)
Out[6]:
array([[4, 5],
[6, 7]])
# 創(chuàng)建從4-7為元素值的數(shù)組
In[7]: b - a
Out[7]:
array([[4, 4],
[4, 4]])
# 數(shù)組間的shape必須相同。
# 需要注意的是:
# 多維數(shù)組的組織方式和矩陣相同,但乘法的運(yùn)算規(guī)格卻和矩陣不同,如果像對ndarray對像使用矩陣的乘法運(yùn)算規(guī)則,可以使用ndarray.dot方法,a和b的矩陣乘法結(jié)果如下:
In[8]: a.dot(b)
Out[8]:
array([[ 6, 7],
[26, 31]])
# 多維數(shù)組還支持邏輯比較運(yùn)算,比如我們想知道一個多維數(shù)組中那些值大于某一個指定值,典型的做法是通過循環(huán)實(shí)現(xiàn),但是在Numpy中卻可以直接通過比較方法實(shí)現(xiàn):
In[9]: a = np.arange(12).reshape(4, 3)
Out[9]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
In[10]: b = a > 5
# 通過a > 5 生成一個形狀與a一直的多維數(shù)組b
In[11]: b
Out[11]:
array([[False, False, False],
[False, False, False],
[ True, True, True],
[ True, True, True]])
In[12]: b.dtype
Out[12]: dtype('bool')
In[13]: a[b]
Out[13]: array([ 6, 7, 8, 9, 10, 11])
# 所有大于5為True的元素的位置在a中的值就可以使用a[b]這種形式列出來。
Numpy的多維數(shù)組還有一些方法,可以用于【統(tǒng)計數(shù)組中的一些流量值】,如下:
- a.sum :計算多位數(shù)組的所有元素的和;
- a.max :最大值計算;
- a.min : 最小值計算;
- a.mean :平均值計算;
- a.std :標(biāo)準(zhǔn)差計算;
- a.var :方差計算。
以上所有方法,都可以接受一個axis參數(shù)(用于指定具體統(tǒng)計哪根軸上的數(shù)據(jù)。比如二維數(shù)組,可以理解為有x, y兩根軸代表行,列,指定axis = 0時表示分別統(tǒng)計每列上的數(shù)據(jù);axis = 1時,表示分別統(tǒng)計每行上的數(shù)據(jù);沒有指定axis參數(shù)時,代表統(tǒng)計所有元素。)
如下:
In[14]: a
Out[14]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
In[15]: a.sum()
Out[15]: 66
In[16]: a.sum(axis=0)
Out[16]: array([18, 22, 26])
In[17]: a.sum(axis=1)
Out[17]: array([ 3, 12, 21, 30])
除了ndarray多位數(shù)組對象自己的方法外,Numpy還自帶了一些通用函數(shù),可以進(jìn)行各種計算:
- np.sqrt :開方運(yùn)算;
- np.dot :矩陣乘法;
- np.sort :排序;
- np.linalg :模塊中包含了一些基本的線形代數(shù)計算函數(shù);
- 更多可查閱文檔。