2021-12-27 Python-21

Numpy

1.數(shù)組的創(chuàng)建
(1) np.array()
(2) np.asarray()
array和asarray都能將數(shù)據(jù)轉(zhuǎn)換為ndarray,當(dāng)輸入的數(shù)據(jù)是列表,元組等非ndarray型時,兩者的功能相同,都是原數(shù)據(jù)的復(fù)制。
如果原數(shù)據(jù)是ndarray,array函數(shù)默認復(fù)制原數(shù)據(jù),而asarray則不復(fù)制,直接指向原數(shù)據(jù)或者說和原數(shù)據(jù)相同。

import numpy as np
a=np.ones((3,3))
b=np.array(a)
c=np.asarray(a)
b is a # false
c is a # True
a[1][1]=0
a
'''
array([[1., 1., 1.],
       [1., 0., 1.],
       [1., 1., 1.]])
'''
b
'''
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])
'''
c
'''
array([[1., 1., 1.],
       [1., 0., 1.],
       [1., 1., 1.]])
'''
#因為a和c指向同一個對象,所以當(dāng)a發(fā)生變化時,c也發(fā)生變化

(3) np.zero() 產(chǎn)生指定長度和形狀的float型全0的數(shù)組

np.zeros(10) #array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros((2,3))
'''
array([[0., 0., 0.],
       [0., 0., 0.]])
'''
np.empty(10)  #array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.empty((2,3,4)) 
'''
array([[[ 8.90104239e-307,  1.89144180e-307,  9.34572443e-307,
          3.56039997e-307],
        [ 4.00536722e-307,  2.55897414e-307,  6.45302316e-307,
          6.89801416e-307],
        [ 3.11521375e-307,  1.89143161e-307,  4.00540117e-307,
          4.45042273e-307]],

       [[ 4.00536043e-307,  6.89799379e-307,  3.11521375e-307,
         -1.04700663e-310],
        [ 4.00540117e-307,  4.22764033e-307,  2.33648883e-307,
          4.00536722e-307],
        [ 6.89798700e-307,  2.33647015e-307,  2.33646676e-307,
          1.61324815e-307]]])
返回一堆未初始化的垃圾數(shù)值
'''
np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 返回一維的數(shù)組,如果需要對數(shù)組進行維度的重設(shè),可以用reshape
np.array(10).reshape(2,5)
'''
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
'''
np.ones(10) #array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
np.ones((2,3)) 
'''
array([[1., 1., 1.],
       [1., 1., 1.]])
'''
np.full((2,3),2)
'''
array([[2, 2, 2],
       [2, 2, 2]])
'''

np.ones_like()
np.zeros_like()
np.full_like()
np.empty_like()

2.數(shù)組的數(shù)據(jù)類型

#在創(chuàng)建數(shù)組時,對數(shù)據(jù)類型進行指定
d=np.ones((3,3),dtype=int)
#顯示數(shù)組的數(shù)據(jù)類型
d.dtype  # dtype('int32')
#顯性轉(zhuǎn)換數(shù)據(jù)類型
d1=d.astype(float)
d1.dtype #dtype('float64')

  1. ndarray的向量化計算
    對數(shù)組內(nèi)的元素進行批量操作時,可以不適用for循環(huán),這種特性稱為向量化。
    在兩個相同尺寸的數(shù)組之間的算數(shù)操作應(yīng)用了逐元素操作的方式
#標量與數(shù)組的計算
a=np.ones((2,4))
2*a
'''
array([[2., 2., 2., 2.],
       [2., 2., 2., 2.]])
'''
#數(shù)組之間的計算
b=np.arange(8).reshape(2,4)
b+a
'''
array([[1., 2., 3., 4.],
       [5., 6., 7., 8.]])
'''
#數(shù)組間的比較,逐元素比較,返回布爾值
b>a
'''
array([[False, False,  True,  True],
       [ True,  True,  True,  True]])
'''

4.索引和切片
數(shù)組的一維索引和列表相似
數(shù)組的切片時原數(shù)組的視圖,對切片所進行的修改會體現(xiàn)在原視圖上
這是因為數(shù)組通常處理很大的數(shù)據(jù)量,如果持續(xù)拷貝會造成內(nèi)存的極大占據(jù)。

a=np.arange(10)
a_s=a[2:5]
a[2:5]=20
a # array([ 0,  1, 20, 20, 20,  5,  6,  7,  8,  9])
a[2:5].copy()
#通過copy函數(shù)實現(xiàn)對切片的復(fù)制

二維數(shù)組的索引可以通過遞歸或者逗號分隔列表的方式訪問,單個索引值返回的時一維數(shù)組,因此高維數(shù)組可以通過索引返回降低一個維度的數(shù)組。

arr=np.arange(8).reshape(2,4)
arr[1][2]
a[1,2]

多維數(shù)組的切片也可以通過用逗號分隔列表的形式

arr_1=np.arange(20).reshape(4,5)
arr_1[0:3,:3]

除了通過數(shù)值直接對數(shù)組進行索引外,還有一種索引方式稱為布爾索引。

arr_index=np.array(['a','b','a','c','c','a','d'])
data=np.random.randn(7,4)
data
'''
array([[-0.38442984, -0.88940964, -0.03817829, -0.43782877],
       [ 0.71924953, -2.1513206 , -0.49891461,  0.96356112],
       [-0.11265069, -0.1308082 , -1.17425045, -0.90269553],
       [-0.61687358, -0.41279736, -0.20380161,  0.97799777],
       [-0.2272037 ,  0.13233819, -1.41848052, -1.40792587],
       [-0.76249436,  0.40601437,  0.94575769, -0.65340026],
       [ 0.08851067, -0.03728107, -0.33236625, -0.63150696]])
'''
#得到一個7行4列的數(shù)組
data[arr_index=='a']
'''
array([[-0.38442984, -0.88940964, -0.03817829, -0.43782877],
       [-0.11265069, -0.1308082 , -1.17425045, -0.90269553],
       [-0.76249436,  0.40601437,  0.94575769, -0.65340026]])
'''
#篩選得到數(shù)組中對應(yīng)的行

布爾數(shù)組arr_index的長度和數(shù)組的縱向索引長度一致,因此可以用來對數(shù)組進行篩選。
除了進行正向選擇,還可以對條件取反。

data[arr_index != 'a']
data[~(arr_index==a)]

也可以對多個條件聯(lián)合

data[(arr_index == 'a') | (arr_index == 'b')] # 取交和取并使用符號,關(guān)鍵詞and/or對布爾值數(shù)組無效

布爾索引和普通索引的另一個不同點是,布爾索引得到的是數(shù)據(jù)的拷貝,不能對原數(shù)據(jù)進行直接的修改。

除了布爾索引和普通索引外,數(shù)組能通過整數(shù)數(shù)組或者列表進行索引,叫做神奇索引。

arr_2=np.zeros((6,6))
for i in range(6):
    arr_2[i]=i
arr_2
'''
array([[0., 0., 0., 0., 0., 0.],
       [1., 1., 1., 1., 1., 1.],
       [2., 2., 2., 2., 2., 2.],
       [3., 3., 3., 3., 3., 3.],
       [4., 4., 4., 4., 4., 4.],
       [5., 5., 5., 5., 5., 5.]])
'''
arr_2[[2,5,1]]
'''
array([[2., 2., 2., 2., 2., 2.],
       [5., 5., 5., 5., 5., 5.],
       [1., 1., 1., 1., 1., 1.]])
'''
#篩選得到對應(yīng)行數(shù)的數(shù)組
arr_3=np.arange(32).reshape(8,4)
arr_3
'''
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, 27],
       [28, 29, 30, 31]])
'''
arr_3[[2,5,1,6],[0,3,1,2]]
#array([ 8, 23,  5, 26])
#相當(dāng)于選取了[2,0][5,3][1,1][6,2]位置的內(nèi)容
arr_3[[2,5,1,6]][:,[0,3,1,2]]
#如此可以得到二維的切片,相當(dāng)于先選取了對應(yīng)的4行,在每行中選取不同的列數(shù)的元素組成新行

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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