[英]Index a 3D array with 2D array numpy
我試圖操縱這樣的索引和源數組:
結果[i] [j] [k] =源[i] [索引[i] [j] [k]]
我知道如何使用for循環來做到這一點,但是我正在使用巨型數組,並且我想使用更省時的方法。 我嘗試使用numpy的高級索引,但是我不太了解。
功能示例:
source = [[0.0 0.1 0.2 0.3]
[1.0 1.1 1.2 1.3]
[2.0 2.1 2.2 2.3]]
indices = [[[3 1 0 1]
[3 0 0 3]]
[[0 1 0 2]
[3 2 1 1]]
[[1 1 0 1]
[0 1 2 2]]]
# result[i][j][k] = source[i][indices[i][j][k]]
result = [[[0.3 0.1 0.0 0.1]
[0.3 0.0 0.0 0.3]]
[[1.0 1.1 1.0 1.2]
[1.3 1.2 1.1 1.1]]
[[2.1 2.1 2.0 2.1]
[2.0 2.1 2.2 2.2]]]
鑒於:
source = [[0.0, 0.1, 0.2, 0.3],
[1.0, 1.1, 1.2, 1.3],
[2.0, 2.1, 2.2, 2.3]]
indices = [[[3, 1, 0, 1],
[3, 0, 0, 3]],
[[0, 1, 0, 2],
[3, 2, 1, 1]],
[[1, 1, 0, 1],
[0, 1, 2, 2]]]
用這個:
import numpy as np
nd_source = np.array(source)
source_rows = len(source) # == 3, in above example
source_cols = len(source[0]) # == 4, in above example
row_indices = np.arange(source_rows).reshape(-1,1,1)
result = nd_source [row_indices, indices]
結果:
print (result)
[[[0.3 0.1 0. 0.1]
[0.3 0. 0. 0.3]]
[[1. 1.1 1. 1.2]
[1.3 1.2 1.1 1.1]]
[[2.1 2.1 2. 2.1]
[2. 2.1 2.2 2.2]]]
要使用Integer Advanced Indexing,關鍵規則是:
整數高級索引的工作方式是:
給定源數組具有n
維,因此我們提供了n
整數索引數組:
將此解釋應用於以上示例:
nd_source = np.array(source)
,它是2d。 我們的最終結果形狀為(3,2,4)
。
因此,我們需要提供2
索引數組,並且這些索引數組必須為(3,2,4)
的最終結果形狀,或者可以廣播為(3,2,4)
形狀。
我們的第一個索引數組是row_indices = np.arange(source_rows).reshape(-1,1,1)
。 ( source_rows
是源中的行數,在本示例中為3
)。此索引數組的形狀為(3,1,1)
,實際上看起來像[[[0]],[[1]],[[2]]]
。 這可以廣播為最終結果形狀(3,2,4)
,並且廣播的數組看起來像[[[0,0,0,0],[0,0,0,0]],[[1,1,1,1],[1,1,1,1]],[[2,2,2,2],[2,2,2,2]]]
。
我們的第二個索引數組是indices
。 盡管這不是數組,而只是列表的列表,但是當我們將其作為發送索引數組傳遞時,numpy足夠靈活,可以自動將其轉換為相應的ndarray。 請注意,即使沒有任何廣播,此數組也已經具有(3,2,4)
的最終期望結果形狀。
遍歷串聯這兩個索引陣列(一個廣播的陣列,而另一個用作是),生成numpy的訪問我們的源2D陣列所需要的所有2元組nd_source
,並生成在所述形狀的最終結果(3,2,4)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.