gpt4 book ai didi

python - numpy 中的二维 bool 掩码产生不同的结果(掩码排序与原始索引)

转载 作者:太空宇宙 更新时间:2023-11-04 00:08:47 26 4
gpt4 key购买 nike

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

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]

任何见解将不胜感激!

最佳答案

您的示例的问题在于您如何定义ab。如果您要打印出 x[a, b]x[mask],您会注意到 x[a, b] 上的第 5 个和第 6 个元素 将与 x[mask] 中的第 5 个和第 6 个值进行切换。这样做的原因是您使用 abmask 中的每个值设置为 True 以进行索引,因此顺序无关紧要,但您重新使用 ab 在断言中为 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]

解决这个问题的一个好方法是首先将 ab 定义为元组列表,首先根据它们的“a 值”对它们进行排序,然后再他们的“b值”并从那里使用它们。这样您就可以保证订单。

关于python - numpy 中的二维 bool 掩码产生不同的结果(掩码排序与原始索引),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53216535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com