各位客官姥爺好,歡迎回來。上節(jié)我們了解numpy中數(shù)組的創(chuàng)建方法,這節(jié)我們來看看數(shù)組都有哪些常用的屬性,以及數(shù)組的淺拷貝與深拷貝的用法。
01
數(shù)組的屬性
0.聲明一個numpy的數(shù)組
np.random.seed(0)
x = np.random.randint(1,10,(2,3))
x
array([[6, 1, 4],
[4, 8, 4]])
1.數(shù)組的類型
x.dtype
dtype('int32')
2.數(shù)組的維數(shù)
x.ndim
2
3.數(shù)組的維度
x.shape
(2, 3)
4.數(shù)組的元素個數(shù)
x.size
6
5.數(shù)組每個元素所占字節(jié)數(shù)
x.itemsize
4
6.數(shù)組所有元素總字節(jié)數(shù)(等于x.size * x.itemsize)
x.nbytes
24
7.數(shù)組在內存中布局的信息
x.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
8.數(shù)組實部
x.real
array([[6, 1, 4],
[4, 8, 4]])
9.數(shù)組的虛部
x.imag
array([[0, 0, 0],
[0, 0, 0]])
10.數(shù)組的轉置屬性
x.T
array([[6, 4],
[1, 8],
[4, 4]])
11.數(shù)組的一維迭代器
y = x.flat
for i in y:
print(i)
6
1
4
4
8
4
當然也可通過這個迭代器去更改數(shù)組的元素
#比如全部改為9
x.flat = 9
x
array([[9, 9, 9],
[9, 9, 9]])
02
數(shù)組的轉化
1. 數(shù)組與列表的互轉
#列表轉為數(shù)組
x = [i for i in range(5)]
arr = np.array(x)
print(arr,type(arr))
#數(shù)組轉為列表
y = arr.tolist()
print(y, type(y))
[0 1 2 3 4] <class 'numpy.ndarray'>
[0, 1, 2, 3, 4] <class 'list'>
2. 數(shù)組與元組的互轉
沒有直接轉化的函數(shù),這里使用python自帶的類型轉換函數(shù)
#元組轉化為數(shù)組
x= (i for i in range(5))
arr = np.array(list(x))
print(arr,type(arr))
#數(shù)組轉化為元組
y = tuple(arr.tolist())
print(y, type(y))
[0 1 2 3 4] <class 'numpy.ndarray'>
(0, 1, 2, 3, 4) <class 'tuple'>
3. 數(shù)組類型的強制轉化
#強制轉化為float32,在轉換類型時建議帶上np.xx類型,避免有錯誤提示。
x= (i for i in range(5))
arr = np.array(list(x))
print(arr,type(arr))
arr.astype(np.float32)
[0 1 2 3 4] <class 'numpy.ndarray'>
array([0., 1., 2., 3., 4.], dtype=float32)
03
數(shù)組的淺拷貝與深拷貝
淺拷貝和深拷貝針對的是可變類型,而數(shù)組屬于可變類型,故可使用。下面就來看看淺拷貝和深拷貝在numpy數(shù)組中的區(qū)別。
1. 淺拷貝
淺拷貝,是指新的對象和源對象指向同一個內存空間。注意這里的關鍵詞:新對象和源對象,這兩個是不同的對象。而我們通常在數(shù)組中用的賦值,只是給源對象起個別名,對象還是那個對象。
x = np.arange(5)
y = x
print(x is y)
True
在numpy中view視圖的用法相當于淺拷貝。
arr = np.arange(5)
drr = arr.view()
print(arr is drr)
drr[0] =5
print(drr,arr)
False
[5 1 2 3 4] [5 1 2 3 4]
更改新建視圖的元素后,原始數(shù)組也發(fā)生變化。
2. 深拷貝
通過上面的淺拷貝可以看出,這樣很容易出現(xiàn)數(shù)據(jù)安全問題,對此出現(xiàn)了深拷貝,一個完全獨立于源對象的副本。可直接使用數(shù)組的copy()方法實現(xiàn)
arr = np.arange(5)
frr = arr.copy()
print(arr is frr)
frr[0] = 10
print(frr,arr)
False
[10 1 2 3 4] [0 1 2 3 4]
當然,也可使用我們上節(jié)學過的用法:
1)array的copy參數(shù)
arr = np.arange(5)
err = np.array(arr,copy=True)
print(arr is err)
err[0] = 15
print(err,arr)
False
[15 1 2 3 4] [0 1 2 3 4]
2)array的subok參數(shù)
arr = np.arange(5)
crr = np.array(arr,subok=True)
print(arr is crr)
crr[0] = 20
print(crr,arr)
False
[20 1 2 3 4] [0 1 2 3 4]
以上就是本次的分享,歡迎各位客官姥爺關注我,方便您第一次時間收到【干貨】!
聯(lián)系客服