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

我正在使用不同的索引方法。我有以下工作示例:


import numpy as np


x = 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] = True

assert x[a, b].shape == x[mask].shape  # passes

assert np.isclose(np.sum(x[mask]), np.sum(x[a, b]))  # passes

assert np.allclose(x[mask], x[a, b])  # fails sometimes

当我用一个不同x的项目尝试它时,最后一个断言失败了。这是一个失败的案例:


import numpy as np


x = 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] = True

assert x[a, b].shape == x[mask].shape  # passes

assert np.isclose(np.sum(x[mask]), np.sum(x[a, b]))  # passes

assert np.allclose(x[mask], x[a, b])  # fails

谁能解释为什么会发生这个错误?我认为这是因为 mask 对 x 的索引与 (a,b) 不同,但不确定如何。


我想这样做是因为我想轻松获得 x[~mask]


DIEA
浏览 171回答 3
3回答

九州编程

您的示例的问题在于您如何定义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 值”对它们进行排序,然后从那里使用它们。这样你就可以保证订单。

当年话下

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]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python