gpt4 book ai didi

python - 根据索引屏蔽 numpy 数组

转载 作者:太空狗 更新时间:2023-10-29 22:30:54 27 4
gpt4 key购买 nike

如何根据实际索引值屏蔽数组?

也就是说,如果我有一个 10 x 10 x 30 矩阵,并且我想在第一个和第二个索引彼此相等时屏蔽该数组。

例如,[1, 1 , :] 应该被屏蔽,因为 1 和 1 彼此相等,但 [1, 2, :] 不应该,因为它们这样做不是。

我只在三维方面问这个问题,因为它类似于我当前的问题并且可能会使事情复杂化。但我的主要问题是,如何根据索引值屏蔽数组?

最佳答案

一般来说,要访问索引的值,您可以使用np.meshgrid:

i, j, k = np.meshgrid(*map(np.arange, m.shape), indexing='ij')
m.mask = (i == j)

此方法的优点是它适用于 ijk 上的任意 bool 函数。它比使用 identity 特例要慢一些。

In [56]: %%timeit
....: i, j, k = np.meshgrid(*map(np.arange, m.shape), indexing='ij')
....: i == j
10000 loops, best of 3: 96.8 µs per loop

正如@Jaime 指出的那样,meshgrid 支持一个sparse 选项,它不会做太多重复,但在某些情况下需要多加注意,因为它们不'广播。它将节省内存并加快速度。例如,

In [77]: x = np.arange(5)

In [78]: np.meshgrid(x, x)
Out[78]:
[array([[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]]),
array([[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2],
[3, 3, 3, 3, 3],
[4, 4, 4, 4, 4]])]

In [79]: np.meshgrid(x, x, sparse=True)
Out[79]:
[array([[0, 1, 2, 3, 4]]),
array([[0],
[1],
[2],
[3],
[4]])]

所以,你可以像他说的那样使用 sparse 版本,但你必须这样强制广播:

i, j, k = np.meshgrid(*map(np.arange, m.shape), indexing='ij', sparse=True)
m.mask = np.repeat(i==j, k.size, axis=2)

还有加速:

In [84]: %%timeit
....: i, j, k = np.meshgrid(*map(np.arange, m.shape), indexing='ij', sparse=True)
....: np.repeat(i==j, k.size, axis=2)
10000 loops, best of 3: 73.9 µs per loop

关于python - 根据索引屏蔽 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18860664/

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