为了账号安全,请及时绑定邮箱和手机立即绑定

numpy 中的 2D 布尔掩码产生不同的结果(掩码排序与原始索引)

numpy 中的 2D 布尔掩码产生不同的结果(掩码排序与原始索引)

DIEA 2021-08-11 21:35:50
我正在使用不同的索引方法。我有以下工作示例:import numpy as npx = np.random.rand(321,321)a = range(0, 300)b = range(1, 301)mask = np.zeros(x.shape, dtype=bool)# a and b are lists mask[a, b] = Trueassert x[a, b].shape == x[mask].shape  # passesassert np.isclose(np.sum(x[mask]), np.sum(x[a, b]))  # passesassert np.allclose(x[mask], x[a, b])  # fails sometimes当我用一个不同x的项目尝试它时,最后一个断言失败了。这是一个失败的案例:import numpy as npx = np.random.rand(431,431)a = [0, 1, 1, 1, 2, 2, 2, 3]b = [1, 0, 2, 4, 3, 1, 11, 2]mask = np.zeros(x.shape, dtype=bool)# a and b are lists mask[a, b] = Trueassert x[a, b].shape == x[mask].shape  # passesassert np.isclose(np.sum(x[mask]), np.sum(x[a, b]))  # passesassert np.allclose(x[mask], x[a, b])  # fails谁能解释为什么会发生这个错误?我认为这是因为 mask 对 x 的索引与 (a,b) 不同,但不确定如何。我想这样做是因为我想轻松获得 x[~mask]
查看完整描述

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 值”对它们进行排序,然后从那里使用它们。这样你就可以保证订单。


查看完整回答
反对 回复 2021-08-11
?
当年话下

TA贡献1890条经验 获得超9个赞

x[a, b]从和x给定的顺序中选择元素。结果会排在前面。abx[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具有相反的那些元素。abmaskTrue2, 12, 3x[mask]x[2, 1]x[2, 3]x[a, b]


查看完整回答
反对 回复 2021-08-11
  • 3 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信