Python 之 Numpy 框架入门
NumPy
目錄-
NumPy
-
基礎(chǔ)使用
- 基本數(shù)據(jù)類型
- 創(chuàng)建基本數(shù)組
- 數(shù)組屬性
-
數(shù)組生成
-
zeros、ones、empty 數(shù)組生成
- numpy.zeros
- numpy.ones
- numpy.empty
- 其它說明
- numpy.random
- numpy.arange
- numpy.linspace
-
zeros、ones、empty 數(shù)組生成
-
數(shù)組操作
- 數(shù)組排序
- 切片索引
- 數(shù)組運(yùn)算符
- 廣播規(guī)則
-
修改數(shù)組
- 修改數(shù)組的形狀
- 翻轉(zhuǎn)數(shù)組
- 修改數(shù)組維度
- 連接數(shù)組
- 分割數(shù)組
- 增刪數(shù)組元素
- 數(shù)組迭代
-
基礎(chǔ)使用
NumPy 是 Python 中用于科學(xué)計(jì)算的基本包。它是一個(gè) Python 庫(kù),提供了一個(gè)多維數(shù)組對(duì)象、各種派生對(duì)象(比如屏蔽數(shù)組和矩陣) ,以及一系列用于數(shù)組快速操作的例程,包括數(shù)學(xué)、邏輯、形狀操作、排序、選擇、 i/o、離散傅里葉變換、基本線性代數(shù)、基本統(tǒng)計(jì)操作、隨機(jī)模擬等等。
官網(wǎng)文檔地址:https://numpy.org/
單純學(xué)習(xí) Numpy 會(huì)比較悶,因?yàn)?Numpy 是用于科學(xué)計(jì)算的。只是學(xué)習(xí)了各種 API 的使用,會(huì)很苦悶學(xué)來干啥,跟人工智能有什么關(guān)系?
安裝 numpy 比較簡(jiǎn)單,直接使用命令安裝即可:
pip install numpy
測(cè)試是否正常:
import numpy as np
print(np.__version__)
基礎(chǔ)使用
基本數(shù)據(jù)類型
下表列舉了常用 NumPy 基本類型。
| 名稱 | 描述 |
|---|---|
| bool_ | 布爾型數(shù)據(jù)類型(True 或者 False) |
| int_ | 默認(rèn)的整數(shù)類型(類似于 C 語(yǔ)言中的 long,int32 或 int64) |
| intc | 與 C 的 int 類型一樣,一般是 int32 或 int 64 |
| intp | 用于索引的整數(shù)類型(類似于 C 的 ssize_t,一般情況下仍然是 int32 或 int64) |
| int8 | 字節(jié)(-128 to 127) |
| int16 | 整數(shù)(-32768 to 32767) |
| int32 | 整數(shù)(-2147483648 to 2147483647) |
| int64 | 整數(shù)(-9223372036854775808 to 9223372036854775807) |
| uint8 | 無符號(hào)整數(shù)(0 to 255) |
| uint16 | 無符號(hào)整數(shù)(0 to 65535) |
| uint32 | 無符號(hào)整數(shù)(0 to 4294967295) |
| uint64 | 無符號(hào)整數(shù)(0 to 18446744073709551615) |
| float_ | float64 類型的簡(jiǎn)寫 |
| float16 | 半精度浮點(diǎn)數(shù),包括:1 個(gè)符號(hào)位,5 個(gè)指數(shù)位,10 個(gè)尾數(shù)位 |
| float32 | 單精度浮點(diǎn)數(shù),包括:1 個(gè)符號(hào)位,8 個(gè)指數(shù)位,23 個(gè)尾數(shù)位 |
| float64 | 雙精度浮點(diǎn)數(shù),包括:1 個(gè)符號(hào)位,11 個(gè)指數(shù)位,52 個(gè)尾數(shù)位 |
| complex_ | complex128 類型的簡(jiǎn)寫,即 128 位復(fù)數(shù) |
| complex64 | 復(fù)數(shù),表示雙 32 位浮點(diǎn)數(shù)(實(shí)數(shù)部分和虛數(shù)部分) |
| complex128 | 復(fù)數(shù),表示雙 64 位浮點(diǎn)數(shù)(實(shí)數(shù)部分和虛數(shù)部分) |
每個(gè)內(nèi)建類型都有一個(gè)唯一定義它的字符代碼,如下:
| 字符 | 對(duì)應(yīng)類型 |
|---|---|
| b | 布爾型 |
| i | (有符號(hào)) 整型 |
| u | 無符號(hào)整型 integer |
| f | 浮點(diǎn)型 |
| c | 復(fù)數(shù)浮點(diǎn)型 |
| m | timedelta(時(shí)間間隔) |
| M | datetime(日期時(shí)間) |
| O | (Python) 對(duì)象 |
| S, a | (byte-)字符串 |
| U | Unicode |
| V | 原始數(shù)據(jù) (void) |
numpy 有個(gè) dtype 函數(shù),用于定義變量類型,其定義如下:
class numpy.dtype(dtype, align=False, copy=False[, metadata])
比如這段代碼定義了一個(gè)numpy 中 int32 類型的變量:
import numpy as np
a = np.dtype(dtype="int32")
print(a)
也可以使用短代碼:
import numpy as np
a = np.dtype("i")
print(a)
等效代碼:
import numpy as np
a = np.dtype(np.int32)
print(a)
運(yùn)行代碼后,都會(huì)打印:
int32
這個(gè)類型是 numpy 中的類型,不是 Python 中的類型,要注意區(qū)分。numpy 的數(shù)值類型實(shí)際上是 dtype 對(duì)象的實(shí)例,并對(duì)應(yīng)唯一的字符,包括 np.bool_,np.int32,np.float32,等等。
因?yàn)?Python 是弱類型,沒有 int32 a = ... 這種語(yǔ)法,所以為了明確定義這個(gè)變量是何種類型,需要使用類型的字符串名稱。
這句話現(xiàn)在可以先不管,后面會(huì)在很多地方使用 dtype,用熟了就知道了。
要注意的是 np.dtype 是創(chuàng)建一個(gè)類型標(biāo)識(shí),本身并沒有存儲(chǔ)變量值。
示例:
import numpy as np
def test(object, dtype):
if dtype == np.int32:
print(f"{object} int32")
elif dtype == np.int64:
print(f"{object} int64")
elif dtype == np.str_:
print(f"{object} str_")
a = 111
b = np.dtype(dtype="int32")
test(a, b)
c = '111'
d = np.dtype(dtype="str")
test(c, d)
創(chuàng)建基本數(shù)組
Numpy 提供了一個(gè)多維數(shù)組對(duì)象、各種派生對(duì)象(比如屏蔽數(shù)組和矩陣) ,numpy 中最重要的對(duì)象是數(shù)組和矩陣。所以要學(xué)會(huì) numpy ,最基本的是學(xué)會(huì) numpy 數(shù)組。
numpy 創(chuàng)建數(shù)組的定義:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
參數(shù)說明:
| 名稱 | 描述 |
|---|---|
| object | 數(shù)組或嵌套的數(shù)列 |
| dtype | 數(shù)組元素的數(shù)據(jù)類型,可選 |
| copy | 對(duì)象是否需要復(fù)制,可選 |
| order | 創(chuàng)建數(shù)組的樣式,C為行方向,F(xiàn)為列方向,A為任意方向(默認(rèn)) |
| subok | 默認(rèn)返回一個(gè)與基類類型一致的數(shù)組 |
| ndmin | 指定生成數(shù)組的最小維度 |
創(chuàng)建一個(gè)基本數(shù)組:
import numpy as np
a = np.array([1, 2, 3])
創(chuàng)建多維數(shù)組
import numpy as np
a = np.array([[1, 2], [3, 4]])
print (a)
定義一個(gè)數(shù)組,然后生成多維數(shù)組:
import numpy as np
a = np.array([1, 2, 3, 4, 5], ndmin = 2)
# 相當(dāng)于 np.array([[1, 2, 3, 4, 5]])
print (a)
b = np.array([1, 2, 3, 4, 5], ndmin = 3)
# 相當(dāng)于 np.array([[[1, 2, 3, 4, 5]]])
print (b)
c = np.array([[1, 2, 3, 4, 5],[1, 2, 3, 4, 5]], ndmin = 3)
# 相當(dāng)于 np.array([[[1, 2, 3, 4, 5],[1, 2, 3, 4, 5]]])
print (c)
數(shù)組屬性
由于 Python 是弱類型,所以想學(xué)習(xí)和了解細(xì)節(jié)的時(shí)候,會(huì)比較懵逼。因此,我們盡量在編寫 Python 代碼時(shí),獲取代碼的一些文檔注釋。
如下面代碼中,定義了一個(gè)數(shù)組:
import numpy as np
a = np.array([[1, 2], [3, 4]])
print (a)
numpy 的數(shù)組,其類型為 ndarray[Any, dtype],完整文檔如下:
a: ndarray[Any, dtype] = np.array([[1, 2], [3, 4]])
所以,要掌握 numpy 數(shù)組,實(shí)際上就是在了解 ndarray。
ndarray 中比較重要的屬性如下:
| 屬性 | 說明 |
|---|---|
| ndarray.ndim | 秩,即軸的數(shù)量或維度的數(shù)量 |
| ndarray.shape | 數(shù)組的維度,對(duì)于矩陣,n 行 m 列 |
| ndarray.size | 數(shù)組元素的總個(gè)數(shù),相當(dāng)于 .shape 中 n*m 的值 |
| ndarray.dtype | ndarray 對(duì)象的元素類型 |
| ndarray.itemsize | ndarray 對(duì)象中每個(gè)元素的大小,以字節(jié)為單位 |
| ndarray.flags | ndarray 對(duì)象的內(nèi)存信息 |
| ndarray.real | ndarray元素的實(shí)部 |
| ndarray.imag | ndarray 元素的虛部 |
| ndarray.data | 包含實(shí)際數(shù)組元素的緩沖區(qū),由于一般通過數(shù)組的索引獲取元素,所以通常不需要使用這個(gè)屬性。 |
回到之前提到過的 numpy.dtype,結(jié)合 numpy.array,其示例代碼如下:
import numpy
import numpy as np
a = np.array([1, 2])
print(a.dtype)
print(a)
t = np.dtype(numpy.float64)
b = np.array(object=[1, 2], dtype=t)
print(b.dtype)
print(b)
如果我們不配置 dtype 參數(shù),那么數(shù)組的 dtype 會(huì)以數(shù)組元素類型為依據(jù)。如果配置了 dtype,那么數(shù)組元素都會(huì)被轉(zhuǎn)換為對(duì)應(yīng)的類型,如 np.array(object=[1, 2], dtype='float64') 。
數(shù)組生成
zeros、ones、empty 數(shù)組生成
numpy.zeros
numpy.zeros 的作用是創(chuàng)建一個(gè)元素全部為 0 的數(shù)組。
其定義如下:
def zeros(shape, dtype=float, order='C', *, like=None, /)
| 參數(shù) | 描述 |
|---|---|
| shape | 數(shù)組形狀 |
| dtype | 數(shù)據(jù)類型,可選 |
| order | 有"C"和"F"兩個(gè)選項(xiàng),分別代表,行優(yōu)先和列優(yōu)先,在計(jì)算機(jī)內(nèi)存中的存儲(chǔ)元素的順序。 |
創(chuàng)建一個(gè)全部由 0 填充的數(shù)組:
import numpy as np
# 長(zhǎng)度為 2
a = np.zeros(2)
print(a)
np.zeros() 默認(rèn)創(chuàng)建的數(shù)組是 float64 類型,如果需要自定義類型,可以使用 dtype:
import numpy as np
# 長(zhǎng)度為 2
a = np.zeros(2,dtype=int)
print(a)
numpy.ones
ones 創(chuàng)建一個(gè)元素值均為 1 的數(shù)組。
其定義如下:
def ones(shape, dtype=None, order='C', *, like=None)
示例如下:
import numpy as np
# 長(zhǎng)度為 2
a = np.ones(2,dtype=int)
print(a)
由于其 API 與 numpy.zeros 一致,因此不再贅述。
numpy.empty
創(chuàng)建一個(gè)指定長(zhǎng)度的空數(shù)組,但是不會(huì)對(duì)內(nèi)存區(qū)域進(jìn)行初始化,所以其被分配的內(nèi)存區(qū)域可能已經(jīng)有值。
其定義如下:
def empty(shape, dtype=None, order='C', *args, **kwargs)
示例:
import numpy as np
# 長(zhǎng)度為 2
a = np.empty(2)
print(a)
由于其沒有初始化內(nèi)存,因此內(nèi)存區(qū)域會(huì)殘留數(shù)據(jù)。
其它說明
此外,還有三個(gè)對(duì)應(yīng)的原型復(fù)制函數(shù):
def empty_like(prototype, dtype=None, order=None, subok=None, shape=None
def zeros_like(prototype, dtype=None, order='K', subok=True, shape=None)
def ones_like(prototype, dtype=None, order='K', subok=True, shape=None)
它們的作用是根據(jù)數(shù)組類型,拷貝一個(gè)相同的結(jié)構(gòu),然后填充對(duì)應(yīng)值。
如下示例,復(fù)制數(shù)組相同的結(jié)構(gòu),但是填充的值為 0。
import numpy as np
a = np.array([[1],[1]])
b = np.zeros_like(a)
print(b)
此外,這三個(gè)函數(shù),可以傳遞元組,生成多維的數(shù)組(矩陣)。
import numpy
import numpy as np
a = np.zeros(shape=(2, 3, 4), dtype=numpy.double)
print(a)
numpy.random
numpy.random 是一個(gè)類,不是一個(gè)函數(shù),numpy.random 中有一些隨機(jī)生成數(shù)組的函數(shù)。
以下是一些常用的 API:
#生成具有給定形狀的均勻分布的隨機(jī)樣本,范圍在[0, 1)之間。
numpy.random.rand(size)
# 生成具有給定形狀的標(biāo)準(zhǔn)正態(tài)分布(平均值為0,方差為1)的隨機(jī)樣本。隨機(jī)樣本取值范圍是[0,1)。
numpy.random.randn(size)
# 正態(tài)分布,指定均值和方差
numpy.random.normal(loc=0.0, scale=1.0, size=None)
# 隨機(jī)生成
numpy.random.random(size=None)
# 從給定的上下限范圍內(nèi)生成隨機(jī)整數(shù)。
numpy.random.randint(low, high=None, size=None, dtype=int)
# 從給定的一維數(shù)組中生成隨機(jī)樣本。
numpy.random.choice(a, size=None, replace=True, p=None)
# 隨機(jī)打亂給定數(shù)組的順序。
numpy.random.shuffle(x)
隨機(jī)數(shù)值生成和正態(tài)分布生成示例如下:
import numpy as np
a = np.random.rand(10)
b = np.random.rand(10)
print(a)
print(b)
[0.39809428 0.83922059 0.10808865 0.00332159 0.75922001 0.26850704
0.04497839 0.59012908 0.0438718 0.59988563]
[0.78161896 0.91401858 0.10980276 0.89723959 0.06802148 0.18993732
0.10664519 0.14121531 0.27353601 0.56878734]
x1 = np.random.randint(10, size=6) # 一維數(shù)組
x2 = np.random.randint(10, size=(3, 4)) # 二維數(shù)組
x3 = np.random.randint(10, size=(3, 4, 5)) # 三維數(shù)組
對(duì)于其它 API,由于篇幅有限,不再贅述。
numpy.arange
numpy.arange 用于有規(guī)律地生成數(shù)組。
其定義如下:
numpy.arange([start, ]stop, [step, ]dtype=None, *, like=None)
| 參數(shù) | 描述 |
|---|---|
start |
起始值,默認(rèn)為0
|
stop |
終止值(不包含) |
step |
步長(zhǎng),默認(rèn)為1
|
dtype |
返回ndarray的數(shù)據(jù)類型,如果沒有提供,則會(huì)使用輸入數(shù)據(jù)的類型。 |
numpy.arange 默認(rèn)從 0 開始生成數(shù)組,間隔為 1。
比如,下面代碼會(huì)生成一個(gè)元素值不超過 4 的數(shù)組,即范圍是 [0,4) 。
import numpy as np
# 長(zhǎng)度為 4
a = np.arange(4)
print(a)
arange(start, stop) 指定開始結(jié)束范圍,但是依然步長(zhǎng)為 1。
import numpy as np
# 長(zhǎng)度為 4
a = np.arange(1,4)
print(a)
arange(start, stop, step) 自定義設(shè)置范圍和步長(zhǎng)。
import numpy as np
# 長(zhǎng)度為 4
a = np.arange(1,10,3)
print(a)
numpy.linspace
numpy.linspace 可以使用線性間隔的方式生成數(shù)組:
np.linspace(0, 10, num=5)
num=5 的含義是從來的之間平均取得 5 個(gè)數(shù)值。
[ 0.
2.5
5.
7.5
10. ]
但是跟我們預(yù)料的結(jié)果可能不太一樣,因?yàn)?linspace() 是包括起始點(diǎn)的,所以 0-10 其實(shí)個(gè)數(shù)是 11 個(gè)。
import numpy as np
# 長(zhǎng)度為 4
a = np.linspace(0, 10, num=10)
print(a)
import numpy as np
# 長(zhǎng)度為 4
a = np.linspace(0, 10, num=11)
print(a)
數(shù)組操作
數(shù)組排序
排序會(huì)返回?cái)?shù)組的副本。
主要排序函數(shù)如下:
sort :按照大小排序
argsort:它是沿指定軸的間接排序,
lexsort:它是對(duì)多個(gè)鍵的間接穩(wěn)定排序,
searchsorted, 它將查找排序數(shù)組中的元素。
partition, 分區(qū),這是一個(gè)部分排序。
對(duì)于 numpy 的數(shù)組,請(qǐng)使用 numpy 的函數(shù)排序,不要使用 Python 自帶的函數(shù)排序。
import numpy as np
# 長(zhǎng)度為 4
a = np.random.rand(10)
print(a)
# 使用 Python 內(nèi)置函數(shù)
print(sorted(a))
# 使用 numpy.sort
print(np.sort(a))
如上圖所示,使用 Python 自帶的函數(shù),會(huì)導(dǎo)致精確度出現(xiàn)問題。
切片索引
可以使用 slice(start,stop,step) 函數(shù)或 [start:stop:step] 進(jìn)行切片。
import numpy as np
a = np.arange(10)
print(a)
# 索引范圍是 2-7 ,間隔為2
# [0 1 2 3 4 5 6 7 8 9]
s1 = slice(2, 7, 2)
# 索引范圍是 2-8 ,間隔為2
# [0 1 2 3 4 5 6 7 8 9]
s2 = slice(2, 8, 2)
print(a[s1])
print(a[s2])
等同于:
import numpy as np
a = np.arange(10)
print(a)
print(a[2:7:2])
print(a[2:8:2])
對(duì)于二維數(shù)組,可以通過坐標(biāo)點(diǎn)取值。
import numpy as np
x = np.array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[9, 10, 11]])
# 左上角、右上角、左下角、右下角 四個(gè)點(diǎn)
a1 = np.array([[0, 0], [3, 3]])
a2 = np.array([[0, 2], [0, 2]])
y = x[a1, a2]
print(y)
[[ 0 2]
[ 9 11]]
取值時(shí),跟一維數(shù)組一致,可以通過索引取值。
import numpy as np
x = np.array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[9, 10, 11]])
y = x[1:2]
print(y)
數(shù)組還可以通過表達(dá)式取值,如 x>5、x<5 等。
import numpy as np
x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
print(x)
print(x[x > 5])
詳細(xì)的表達(dá)式操作方法,可以查閱官網(wǎng)文檔,這里不再贅述。
數(shù)組運(yùn)算符
numpy 數(shù)組,可以通過操作符直接操作。
如兩個(gè)數(shù)組的值相加:
import numpy as np
a1 = np.array([1, 2, 3])
a2 = np.array([4, 5, 6])
a3 = a1 + a2
a4 = a1 * a2
print(a3)
print(a4)
得到:
[5 7 9]
[ 4 10 18]
廣播規(guī)則
對(duì)于不同形狀的數(shù)組(即維數(shù)不同),numpy 可以自動(dòng)補(bǔ)全維數(shù)。
其規(guī)則約束如下:
-
兩個(gè)數(shù)組的形狀相同
-
維數(shù)比較少的數(shù)組,需要是一維數(shù)組。
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b = np.array([100, 100, 100])
print(a + b)
[ [
[1, 2, 3] + [100, 100, 100]
[4, 5, 6] + [100, 100, 100]
[7, 8, 9] + [100, 100, 100]
] ]
相加后:
[
[101 102 103]
[104 105 106]
[107 108 109]
]
但是要注意,如果兩個(gè)數(shù)組的一個(gè)維中,元素個(gè)數(shù)不一致,則運(yùn)算會(huì)報(bào)錯(cuò)。
import numpy as np
a1 = np.array([1, 2, 3])
a2 = np.array([4, 5, 6, 7])
a3 = a1 + a2
print(a3)
如果兩個(gè)數(shù)組維度一致,但是形狀不一樣,維數(shù)少的數(shù)組必須是一維數(shù)組。
如下面代碼會(huì)報(bào)錯(cuò):
import numpy as np
a = np.array([[1, 2, 3],
[1, 1, 1],
[1, 1, 1]])
b = np.array([[1, 1, 1],
[2, 2, 2]])
print(a + b)
修改數(shù)組
Numpy 中包含了一些函數(shù)用于處理數(shù)組,大概可分為以下幾類:
- 修改數(shù)組形狀
- 翻轉(zhuǎn)數(shù)組
- 修改數(shù)組維度
- 連接數(shù)組
- 分割數(shù)組
- 數(shù)組元素的添加與刪除
修改數(shù)組的形狀
主要有以下函數(shù):
| 函數(shù) | 描述 |
|---|---|
reshape |
不改變數(shù)據(jù)的條件下修改形狀 |
flat |
數(shù)組元素迭代器 |
flatten |
返回一份數(shù)組拷貝,對(duì)拷貝所做的修改不會(huì)影響原始數(shù)組 |
ravel |
返回展開數(shù)組 |
將一維數(shù)組,轉(zhuǎn)換為二維數(shù)組,每個(gè)數(shù)組元素有 3 個(gè),其示例如下:
import numpy as np
a = np.arange(6).reshape(2, 3)
b = np.array([0,1,2,3,4,5]).reshape(2, 3)
print(a)
print(b)
[[0 1 2]
[3 4 5]]
[[0 1 2]
其它幾個(gè)函數(shù)可以使用以下示例表達(dá):
import numpy as np
a = np.arange(10)
print(a)
# 數(shù)組迭代器 .flat
for element in a.flat:
print(element)
# 將數(shù)組轉(zhuǎn)換為二維數(shù)組
b = a.reshape(2,5)
print("將數(shù)組轉(zhuǎn)換為二維:")
print(b)
print("將多維數(shù)組合并為一維:")
c = b.ravel()
print(c)
[0 1 2 3 4 5 6 7 8 9]
0
1
2
3
4
5
6
7
8
9
將數(shù)組轉(zhuǎn)換為二維:
[[0 1 2 3 4]
[5 6 7 8 9]]
將多維數(shù)組合并為一維:
[0 1 2 3 4 5 6 7 8 9]
翻轉(zhuǎn)數(shù)組
其常用函數(shù)定義如下:
| 函數(shù) | 描述 |
|---|---|
transpose |
對(duì)換數(shù)組的維度 |
ndarray.T |
和 self.transpose() 相同 |
rollaxis |
向后滾動(dòng)指定的軸 |
swapaxes |
對(duì)換數(shù)組的兩個(gè)軸 |
transpose 、ndarray.T 都可以將數(shù)組翻轉(zhuǎn),例如將 2x5 的數(shù)組翻轉(zhuǎn)為 5x2。
import numpy
import numpy as np
a = np.arange(10).reshape(2,5)
print(a)
b = numpy.transpose(a)
c = a.T
print(b)
print(c)
[[0 1 2 3 4]
[5 6 7 8 9]]
[[0 5]
[1 6]
[2 7]
[3 8]
[4 9]]
[[0 5]
[1 6]
[2 7]
[3 8]
[4 9]]
rollaxis 、swapaxes 都有三個(gè)參數(shù):
arr:數(shù)組
axis:要向后滾動(dòng)的軸,其它軸的相對(duì)位置不會(huì)改變。取值范圍為 [0, a.ndim]
start:默認(rèn)為零,表示完整的滾動(dòng)。會(huì)滾動(dòng)到特定位置。取值范圍為 [-a.ndim, a.ndim]
注意:二維只有 0、1 兩個(gè)軸,三維有 0、1、2 三個(gè)軸。axis、start 都是填寫軸的序號(hào)。
使用 print(a1.ndim) 可以打印數(shù)組的維數(shù),即軸數(shù)。
swapaxes 用于指定交互兩個(gè)軸的位置。
如:
import numpy
import numpy as np
a1 = np.array([
[0, 0, 0, 0],
[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]
])
b = np.swapaxes(a1, 0, 1)
print(b)
原數(shù)組:
[[0, 0, 0, 0]
[1, 1, 1, 1]
[2, 2, 2, 2]
[3, 3, 3, 3]]
變換后的數(shù)組:
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]
也可以理解成坐標(biāo)系的 x 軸 和 y 軸,x 軸變成了 y 軸。
swapaxes 在更多維數(shù)組的情況下,有更多的軸,例如三維的 x、y、z 三個(gè)軸。這里不再贅述。
至于 numpy.rollaxis ,我也不會(huì)。
修改數(shù)組維度
其主要函數(shù)如下:
| 維度 | 描述 |
|---|---|
broadcast |
產(chǎn)生模仿廣播的對(duì)象 |
broadcast_to |
將數(shù)組廣播到新形狀 |
expand_dims |
擴(kuò)展數(shù)組的形狀 |
squeeze |
從數(shù)組的形狀中刪除一維條目 |
連接數(shù)組
其主要函數(shù)如下:
| 函數(shù) | 描述 |
|---|---|
concatenate |
連接沿現(xiàn)有軸的數(shù)組序列 |
stack |
沿著新的軸加入一系列數(shù)組。 |
hstack |
水平堆疊序列中的數(shù)組(列方向) |
vstack |
豎直堆疊序列中的數(shù)組(行方向) |
numpy.concatenate 將兩個(gè)數(shù)組拼接成一個(gè)新的數(shù)組:
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
c = np.concatenate((a, b))
print(c)
分割數(shù)組
其主要函數(shù)如下:
| 函數(shù) | 數(shù)組及操作 |
|---|---|
split |
將一個(gè)數(shù)組分割為多個(gè)子數(shù)組 |
hsplit |
將一個(gè)數(shù)組水平分割為多個(gè)子數(shù)組(按列) |
vsplit |
將一個(gè)數(shù)組垂直分割為多個(gè)子數(shù)組(按行) |
其使用方法比較簡(jiǎn)單,這里不再贅述。
增刪數(shù)組元素
其主要函數(shù)如下:
| 函數(shù) | 元素及描述 |
|---|---|
resize |
返回指定形狀的新數(shù)組 |
append |
將值添加到數(shù)組末尾 |
insert |
沿指定軸將值插入到指定下標(biāo)之前 |
delete |
刪掉某個(gè)軸的子數(shù)組,并返回刪除后的新數(shù)組 |
unique |
查找數(shù)組內(nèi)的唯一元素 |
其使用方法比較簡(jiǎn)單,這里不再贅述。
數(shù)組迭代
前面提到過 .flat 。
import numpy as np
# 這里是二維
a = np.arange(10).reshape(2,5)
# 數(shù)組迭代器 .flat
for element in a.flat:
print(element)
.flat 會(huì)按照順序打印每一個(gè)元素。
0
1
2
3
4
5
6
7
8
9
.nditer 也是如此。
import numpy as np
a = np.arange(10).reshape(2,5)
# 數(shù)組迭代器 .flat
for element in np.nditer(a):
print(element)
.nditer 可以控制遍歷規(guī)則。
for x in np.nditer(a.T, order='C'),默認(rèn),行遍歷。
for x in np.nditer(a, order='F'),列遍歷。
import numpy as np
a = np.arange(10).reshape(2, 5)
# 數(shù)組迭代器 .flat
for element in np.nditer(a, order='F'):
print(element)
0
5
1
6
2
7
3
8
4
9
.nditer 可以控制迭代多維數(shù)組的維還是元素。
前面提到的代碼,均是迭代逐個(gè)元素。
如果設(shè)置了 flags 參數(shù),則可以迭代維。
import numpy as np
a = np.arange(10).reshape(2, 5)
# 數(shù)組迭代器 .flat
for element in np.nditer(a, order='F', flags=['external_loop']):
print(element)
原數(shù)組:
[[0 1 2 3 4]
[5 6 7 8 9]]
按照迭代方向 F:
[0 5]
[1 6]
[2 7]
[3 8]
[4 9]
總結(jié)
以上是生活随笔為你收集整理的Python 之 Numpy 框架入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【SLAM建图和导航仿真实例】(一)-
- 下一篇: 【SLAM建图和导航仿真实例】(三)-