1.數(shù)組算術(shù):
數(shù)組允許進(jìn)行批量操作而無需使用for循環(huán),因此更加簡便,這種特性也被稱為向量化。任何兩個等尺寸之間的算術(shù)操作都應(yīng)用逐元素操作的方式進(jìn)行。
import numpy as np
arr1 = np.array([[1,2,3,4],[9,8,7,6]])
arr2 = np.array([[4,3,2,1],[6,7,8,9]])
arr1 + arr2
Out[4]:
array([[ 5, 5, 5, 5],
[15, 15, 15, 15]])
arr1 * arr2
Out[5]:
array([[ 4, 6, 6, 4],
[54, 56, 56, 54]])
1 / arr1
Out[6]:
array([[1. , 0.5 , 0.33333333, 0.25 ],
[0.11111111, 0.125 , 0.14285714, 0.16666667]])
arr2 * 0.8
Out[7]:
array([[3.2, 2.4, 1.6, 0.8],
[4.8, 5.6, 6.4, 7.2]])
同尺度數(shù)組之間的比較,會產(chǎn)生一個布爾型數(shù)組。
arr1 > arr2
Out[8]:
array([[False, False, True, True],
[ True, True, False, False]])
上述操作均是在同尺度數(shù)組之間進(jìn)行的,對于不同尺度數(shù)組間的操作,會使用到廣播特性。
2.數(shù)組索引與切片:
索引:獲取數(shù)組中特定位置元素的過程;
切片:獲取數(shù)組元素子集的過程。
- 一維數(shù)組的索引和切片:與python的列表類似

image
- 多維數(shù)組的索引:

image
- 多維數(shù)組的切片:

image
3.數(shù)組的變換:
- ndarray數(shù)組的維度變換方法:
| 函數(shù) | 說明 |
|---|---|
| .reshape(shape) | 不改變數(shù)組元素,返回一個shape形狀的數(shù)組,原數(shù)組不變 |
| .resize(shape) | 與.reshape()功能一致,但修改原數(shù)組 |
| .swapaxes(ax1,ax2) | 將數(shù)組n個維度中兩個維度進(jìn)行調(diào)換 |
| .flatten() | 對數(shù)組進(jìn)行降維,返回折疊后的一維數(shù)組,原數(shù)組不變 |
a = np.ones((2,3,4),dtype=np.int32)
a
Out[10]:
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]]])
a.reshape((3,8))
Out[11]:
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]])
a
Out[12]:
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]]])
a.resize((3,8))
a
Out[14]:
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]])
a.flatten()
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])
a
Out[16]:
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]])
- ndarray數(shù)組的類型變換方法:
new_a = a.astype(new_type)
astype()方法一定會創(chuàng)建新的數(shù)組(原始數(shù)據(jù)的一個拷貝),即使兩個類型一致。
a = np.ones((2,3,4),dtype=np.int32)
a
Out[18]:
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]]])
b = a.astype(np.float)
b
Out[20]:
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.]]])
- ndarray數(shù)組向列表的轉(zhuǎn)換:
ls = a.tolist()
a = np.full((2,3,4),25,dtype=np.int32)
a
Out[22]:
array([[[25, 25, 25, 25],
[25, 25, 25, 25],
[25, 25, 25, 25]],
[[25, 25, 25, 25],
[25, 25, 25, 25],
[25, 25, 25, 25]]])
a.tolist()
Out[23]:
[[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]],
[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]]]
4.數(shù)組轉(zhuǎn)置與換軸:
轉(zhuǎn)置是一種特殊的數(shù)據(jù)重組形式,可以返回底層數(shù)據(jù)的視圖而不需要復(fù)制任何內(nèi)容。
數(shù)組擁有transpose方法,也有特殊的T屬性。
arr = np.arange(15).reshape((3,5))
arr
Out[33]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
arr.transpose
Out[34]: <function ndarray.transpose>
arr.T
Out[35]:
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
對于更高緯度的數(shù)組,transpose方法可以接受包含軸編號的元組,用于轉(zhuǎn)置軸。
arr = np.arange(16).reshape((2,2,4))
arr
Out[37]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
# 下面的操作是將原來的第二個軸變?yōu)榈谝粋€,原來的第一個軸變?yōu)榈诙€軸,最后一個軸不變
arr.transpose((1,0,2))
Out[38]:
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
ndarray的swapaxes方法,通過接受一對軸編號作為參數(shù),并對軸進(jìn)行調(diào)整用于重組數(shù)據(jù)。
swapaxes方法返回的是數(shù)據(jù)的視圖,而沒有對數(shù)據(jù)進(jìn)行復(fù)制。
arr = np.arange(16).reshape((2,2,4))
arr
Out[44]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
arr.swapaxes(1,2)
Out[45]:
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]]])
arr.shape
Out[46]: (2, 2, 4)
arr.swapaxes(1,2).shape
Out[47]: (2, 4, 2)
Reference:
《Python for Data Analysis:Data Wrangling with Pandas,Numpy,and IPython》