我有一個相對簡單的問題,如果不使用回圈就無法解決。我很難找出這個問題的正確標題。假設我們有兩個 numpy 陣列:
array_1 = np.array([[0, 1, 2],
[3, 3, 3],
[3, 3, 4],
[3, 6, 2]])
array_2 = np.array([[0, 0, 0],
[1, 1, 1],
[2, 2, 2],
[3, 3, 3],
[4, 4, 4],
[5, 5, 5],
[6, 6, 6]])
array_1array_2表示我們想要的行的索引sum。因此,例如,陣列中的4第 行應包含與array_1中的所有 s 具有相同行索引的所有行的總和。resultarray_23
在代碼中更容易理解:
result = np.empty(array_2.shape)
for i in range(array_1.shape[0]):
for j in range(array_1.shape[1]):
index = array_1[i, j]
result[index] = result[index] array_2[i]
結果應該是:
[[ 0 0 0]
[ 0 0 0]
[ 3 3 3]
[10 10 10]
[ 2 2 2]
[ 0 0 0]
[ 3 3 3]]
我嘗試使用np.einsum,但我需要將陣列中的兩個元素都用作索引,并將其行用作索引,所以我不確定np.einsum這里是否是最佳路徑。
這是我在圖形中遇到的問題。array_1表示三角形的頂點索引并array_2表示法線,其中行的索引對應于頂點的索引
uj5u.com熱心網友回復:
每當您從重復索引中添加某些內容時,普通的 ufuncnp.add都不能開箱即用,因為它們只處理一次重復的精美索引。相反,您必須使用無緩沖版本,即np.add.at.
在這里,您有一對索引:行 inarray_1是 的行索引array_2,元素 ofarray_1是輸出的行索引。
首先,將索引明確地構造為花哨的索引。這將使使用它們變得更加簡單:
output_row = array_1.ravel()
input_row = np.repeat(np.arange(array_1.shape[0]), array_1.shape[1]).ravel()
您可以input_row直接申請array_2,但您需要add.at使用output_row:
output = np.zeros_like(array_2)
np.add.at(output, output_row, array_2[input_row])
您實際上只使用 的前四行array_2,因此可以將其截斷為
array_2 = array2[:array_1.shape[0]]
在這種情況下,您可能希望將輸出初始化為:
output = np.zeros_like(array_2, shape=(output_row.max() 1, array2.shape[1]))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/410494.html
標籤:
上一篇:Pandas中的用戶輸入日期偏移
