一般に、インデックスの値にアクセスするには、次を使用できますnp.meshgrid
。
i, j, k = np.meshgrid(*map(np.arange, m.shape), indexing='ij')
m.mask = (i == j)
この方法の利点はi
、 、j
、およびの任意のブール関数に対して機能することk
です。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