In general, you can use np.meshgrid to access the value of indices:
i, j, k = np.meshgrid(*map(np.arange, m.shape), indexing='ij') m.mask = (i == j)
The advantage of this method is that it works for arbitrary Boolean functions on i , j and k . This is a bit slower than using the special case of 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
As @Jaime points out, meshgrid supports the sparse parameter, which does not do much duplication, but in some cases requires a bit more caution, since they are not broadcast. This will save memory and speed up work a little. For instance,
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]])]
So, you can use the sparse version as it says, but you must force the translation as such:
i, j, k = np.meshgrid(*map(np.arange, m.shape), indexing='ij', sparse=True) m.mask = np.repeat(i==j, k.size, axis=2)
And acceleration:
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