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

也就是说,如果我有一个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/

10-10 11:01