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]
添加回答
举报