Python Numpy學(xué)習(xí)筆記。 vol3. 20190315

本文章僅供我本人學(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ù)組:
  1. np.arange,類似于range,創(chuàng)建一維數(shù)組;
  2. np.ones, 創(chuàng)建元素值全部是1的數(shù)組;
  3. np.zeros,創(chuàng)建元素值全部是0的數(shù)組;
  4. np.empty,創(chuàng)建空值的多位數(shù)組,只分配內(nèi)存,不填充任何值;
  5. 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ù);
  • 更多可查閱文檔。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容