Numpy中的不同方式的切片索引

2021-09-13 23:10:17 字數 4835 閱讀 3012

陣列的切片

布林索引

ps:在這裡我將離散地選取單個或多個元素的操作歸納在索引的內容裡面,而將連續的選取一系列元素放在切面的內容裡

numpy中的基本索引與python類似,對於一維或多維陣列,可以直接基於0~n的下標進行索引。

import numpy as np

#一維陣列的索引

arr = np.arange(10)

print

(arr)

print

('arr[0] = %d'

% arr[0]

)# 列印第0個元素

print

('----------------------------'

)#多維陣列的索引

arr = np.arange(12)

.reshape(3,

4)print

(arr)

print

('arr[2][1] = %d'

% arr[2]

[1])

# 列印第三行第二列的元素

輸出結果為:

[01

2345

6789

]arr[0]

=0--

----

----

----

----

----

----

--[[

0123

][45

67][

891011]]

arr[2]

[1]=

9

當我們需要一次索引多個陣列元素的時候,我們就要傳入多個索引。對於一維陣列,我們可以傳入乙個乙個陣列,這個陣列的內容就是要選取元素的下標。

import numpy as np

#一維陣列的索引

arr = np.arange(10)

print

(arr)

print

(arr[[0

,2,4

,5]]

)# 列印第0,2,4,5個元素

輸出結果為:

[01

2345

6789

][02

45]

對於二維陣列,我們可以傳入兩個陣列。兩個陣列分別代表了要選取元素的行的下標和列的下標。可以想象,如果我們要選取四個元素,每個元素都有乙個行下標和列下標,第乙個元素的行下標儲存在第乙個陣列的第0位置,而它的列下標儲存在第二個陣列的第0位置。同理,第二元素的行下標儲存在第乙個陣列的第1位置,其列下標儲存在第二個陣列的第1位置。這就是numpy的整數陣列索引。注意:整數陣列的索引中,兩個陣列的引數必須一致。

import numpy as np

#二維陣列的索引

arr = np.arange(12)

.reshape(3,

4)print

(arr)

# 列印第1行第1列 和 第1行第2列 第2行第3列 第3行第3列 的元素

# 注意python中的索引從0開始

print

(arr[[0

,0,1

,2],

[0,1

,2,2

]])

輸出結果為:

[[0

123]

[456

7][8

91011]

]---

----

----

----

----

----

----

----

----

--[0

1610]

對於一維陣列的切片和python中對list的切片基本相同

import numpy as np

#一維陣列的切片

arr = np.arange(10)

print

(arr)

print(''

)# 空行

print

(arr[2:

])# 擷取第3個至末尾的元素

print

(arr[1:

5])# 擷取第2個至第4個元素(不包含第4個)

輸出結果為:

[01

2345

6789

][23

4567

89][

1234

]

對於二維陣列,可以同時對行和列進行行切片。

import numpy as np

#二維陣列的索引

arr = np.arange(12)

.reshape(3,

4)print

(arr)

print(''

)print

(arr[0:

2,0:

3])# 取二維陣列前兩行前三列

輸出結果為:

[[0

123]

[456

7][8

91011]

][[0

12][

456]

]

使用 : 的切片操作只能選取連續的行列。如果我們要選取離散的列,可以採取以下方式,在列的索引處傳入乙個陣列。假設我們選取前兩行中的第4列和第1列,我們就傳入[4,1],numpy會根據傳入索引的順序拼接出乙個新的陣列,效果如下。

import numpy as np

#二維陣列的索引

arr = np.arange(12)

.reshape(3,

4)print

(arr)

print(''

)print

(arr[0:

2,[3

,0]]

)# 取前兩行中的第1列和第4列

輸出結果為:

[[0

123]

[456

7][8

91011]

][[3

0][7

4]]

這樣我們就看到了我們將第4列的前兩行元素和第一列的前兩行元素放在了乙個二維陣列中。同理如果想要選取兩個離散的行也可以在行的索引處傳入乙個包含索引的陣列。

但是,這樣做的必須有乙個維度上必須是連續的索引,比如這個例子中行是乙個連續索引(切片)。如果要同時選取離散的行和列,再用類似的方法就不行了。因為如果行和列都傳入乙個關於索引的陣列那麼就是整數陣列索引了,它索引出來的是行和列相對應的單個元素。

因此我們需要通過np.ix_()函式進行索引。

import numpy as np

#二維陣列的索引

arr = np.arange(12)

.reshape(3,

4)print

(arr)

print(''

)print

(arr[np.ix_([0

,2],

[0,3

])])

# 取前(第1行|第3行)中的(第1列|第4列)的所有元素

輸出結果為:

[[0

123]

[456

7][8

91011]

][[0

3][8

11]]

如果我們將乙個陣列與乙個值比較,就會返回乙個與該陣列維度相同的陣列,其中每個元素都是bool型引數。其實就是將陣列中每乙個元素與該值進行比較返回的bool值構成了乙個新的與該陣列維度相同的陣列。

import numpy as np

arr = np.arange(12)

.reshape(3,

4)print

(arr)

print(''

)b = arr >

5print

(b)# 取前(第1行|第3行)中的(第1列|第4列)的所有元素

輸出結果為:

[[0

123]

[456

7][8

91011]

][[false

false

false

false][

false

false

true

true][

true

true

true

true

]]

對於新得到的布林型的陣列,我們可以通過它來作為乙個新的索引。通過這個索引我們可以將bool值為true的值給選取出來。

在這個例子當中,我們於是就可以將陣列中所有大於5的數值都給取了出來。

print

(arr[b]

)

輸出結果為:

[67

891011

]

類似的,還能通過extract()函式來取出相對應位置為true的值。

print

(np.extract(b,arr)

)

輸出結果為:

[67

891011

]

numpy中的陣列切片

如同python中自帶的切片,numpy中也有類似的切片功能。接下來對兩個功能進行一下簡單的對比。首先測試python自帶的功能,在shell視窗中測試如下 in 1 data range 10 in 2 data out 2 0,1,2,3,4,5,6,7,8,9 in 3 data1 data ...

Objective C中不同方式實現鎖 二

在上一文中,我們已經討論過用objective c鎖幾種實現 跳轉位址 也用 實際的演示了如何通過構建乙個互斥鎖來實現多執行緒的資源共享及執行緒安全,今天我們繼續討論鎖的一些高階用法。1.nsrecursivelock遞迴鎖 平時我們在 中使用鎖的時候,最容易犯的乙個錯誤就是造成死鎖,而容易造成死鎖...

Objective C中不同方式實現鎖(2)

在上一文中,我們已經討論過用objective c鎖幾種實現 跳轉位址 也用 實際的演示了如何通過構建乙個互斥鎖來實現多執行緒的資源共享及執行緒安全,今天我們繼續討論鎖的一些高階用法。1.nsrecursivelock遞迴鎖 平時我們在 中使用鎖的時候,最容易犯的乙個錯誤就是造成死鎖,而容易造成死鎖...