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')
- 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ù)的元素組成新行