我試圖用從第二個 [mxnxf] 陣列中提取的值填充第一個 [mxn] numpy 陣列,其中索引 f 由第三個 [mxn] 陣列提供,但我還沒有找到一種方法這樣做不需要昂貴的 for 回圈。下面是一個簡單的有代表性的例子:
import numpy as np
import random
m, n, k = 3, 2, 4
np.random.seed(1234)
a = np.random.randint(0,9,(m, n, k))
print(a)
b = np.random.randint(0,k,(m,n))
print(b)
c = np.zeros((m, n))
print(c)
我現在想用 a 中的值填充 c,如下所示:
c[i,j] = a[i,j,b[i,j]]
換句話說,對于 c 中的每個位置 [i,j ],在沿前兩個軸的相同位置 [i,j] 和沿第三個軸的位置繪制值,該位置通過評估陣列 b 在[i,j] 位置。在我的示例中(您的隨機整數可能會有所不同?),陣列的值如下:
a :
[[[3 6 5 4]
[8 1 7 6]]
[[8 0 5 0]
[6 2 0 5]]
[[2 6 3 7]
[0 0 3 2]]]
b :
[[3 0]
[1 3]
[3 3]]
想要的結果是:
c :
[[4 8]
[0 5]
[7 2]]
我們得出如下結果:從 i, j = 0,0 開始。然后,c[0,0] = [a[0,0,b[0,0]],并且由于 b[0,0] 的值為 3,因此 a 的計算值為 a[0,0,3],即 4. 繼續 i, j = 0, 1. 這里 c[0,1] = [a[0,1,b[0,1]],并且由于 b[0,1] 的值為 0, a 在 a[0,1,0] 處求值,即 8。依此類推。我很清楚如何使用嵌套回圈來做到這一點,但我試圖避免這種情況,因為我的實際陣列要大得多。非常感謝您的幫助!
uj5u.com熱心網友回復:
Numpy 索引廣播到輸出陣列的形狀:
c = a[np.arange(b.shape[0])[:, None], np.arange(b.shape[1]), b]
您還可以使用np.take_along_axis來避免在其他軸中手動生成索引,但這里的索引必須廣播到輸入陣列:
c = np.take_along_axis(a, b[..., None], -1)
uj5u.com熱心網友回復:
使用np.unravel_index創建索引,索引,然后.reshape:
c = np.empty((m, n), dtype=np.int32)
ro, co = np.unravel_index(np.arange(n * m), (m, n))
c[:, :] = a[ro, co, b[ro, co]].reshape(3,2)
print(c)
輸出
[[4 8]
[0 5]
[7 2]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/348729.html
