3 回答

TA貢獻1785條經驗 獲得超4個贊
您的示例的問題在于您如何定義a和b。如果您要打印出來x[a, b]并且x[mask]您會注意到第 5 個和第 6 個元素 onx[a, b]將與第 5 個和第 6 個值在x[mask]. 這樣做的原因是您將每個值設置mask為 True usinga和bto index 所以順序無關緊要,但您在斷言中使用a和b索引 x 所以順序很重要。當你做你的索引時,numpy 會a從你的矩陣中獲取每個值以從你的矩陣中獲取適當的行,并使用相同索引中的值b來索引到該行。舉例說明使用 3x8 數組:
a = [0, 1, 1, 1, 2, 2, 2]
b = [1, 0, 2, 4, 3, 1, 7]
x = [[1, 2, 3, 4, 5, 6, 7, 8],
[9, 10, 11, 12, 13, 14, 15, 16],
[17, 18, 19, 20, 21, 22, 23, 24]]
x[a, b] = [2, 9, 11, 13, 20, 18, 24]
mask[a, b] = [2, 9, 11, 13, 18, 20, 24]
解決此問題的一個好方法是首先定義a并b作為元組列表,首先按“a 值”對它們進行排序,然后按“b 值”對它們進行排序,然后從那里使用它們。這樣你就可以保證訂單。

TA貢獻1890條經驗 獲得超9個贊
x[a, b]
從和x
給定的順序中選擇元素。結果會排在前面。a
b
x[a[i], b[i]]
x[a[i+1], b[i+1]]
x[mask]
通過mask
以行優先順序迭代以查找True
單元格,按給定的順序選擇元素。這只是相同的順序x[a, b]
,如果zip(a, b)
已按字典順序排序。
在您失敗的示例中,在and2, 3
之前2, 1
出現,但按行優先順序迭代會找到at before 。因此,have before , while具有相反的那些元素。a
b
mask
True
2, 1
2, 3
x[mask]
x[2, 1]
x[2, 3]
x[a, b]
添加回答
舉報