[Numpy-discussion] Indexing a 2-d array with a 1-d mask
Friedrich Romstedt
friedrichromstedt at gmail.com
Wed Feb 9 04:24:16 EST 2011
Hi,
2011/2/8 Alok Singhal <alok at merfinllc.com>:
> Hi,
>
> I have an NxM array, which I am indexing with a 1-d, length N boolean
> array. For example, with a 3x5 array:
>
> In [1]: import numpy
> In [2]: data = numpy.arange(15)
> In [3]: data.shape = 3, 5
>
> Now, I want to select rows 0 and 2, so I can do:
>
> In [4]: mask = numpy.array([True, False, True])
> In [5]: data[mask]
> Out[5]:
> array([[ 0, 1, 2, 3, 4],
> [10, 11, 12, 13, 14]])
>
> But when the shape of 'data' is a 0xM, this indexing fails:
>
> In [6]: data2 = numpy.zeros((0, 5), 'd')
> In [7]: mask2 = numpy.zeros(0, 'bool')
> In [8]: data2[mask2]
> ------------------------------------------------------------
> Traceback (most recent call last):
> File "<ipython console>", line 1, in <module>
> IndexError: invalid index
>
> I would have expected the above to give me a 0x5 array.
> Is there any other way to do what I
> am doing?
Like so (works only for ndim==2):
>>> d1 = numpy.arange(0).reshape((0, 5))
>>> d2 = numpy.arange(15).reshape((3, 5))
>>> index1 = numpy.asarray([], dtype=numpy.bool)
>>> index2 = numpy.asarray([True, False, True], dtype=numpy.bool)
>>> x = numpy.arange(5)
>>> (x1, y1) = numpy.meshgrid(x, index1.nonzero()[0])
>>> (x2, y2) = numpy.meshgrid(x, index2.nonzero()[0])
>>> (x1, y1)
(array([], shape=(0, 5), dtype=int32), array([], shape=(0, 5), dtype=int32))
>>> print x2, "\n", y2
[[0 1 2 3 4]
[0 1 2 3 4]]
[[0 0 0 0 0]
[2 2 2 2 2]]
>>> d1[y1, x1]
array([], shape=(0, 5), dtype=int32)
>>> d2[y1, x1]
array([], shape=(0, 5), dtype=int32)
>>> d2[y2, x2]
array([[ 0, 1, 2, 3, 4],
[10, 11, 12, 13, 14]])
I don't know if the other thing is a bug, but it looks like. I could
imagine that it has something to do with the implicit slicing on the
array without data? Rather an imperfection ...
Consider this:
>>> d1 = numpy.arange(0).reshape((0,))
>>> d2 = numpy.arange(0).reshape((0, 5))
>>> d3 = numpy.arange(0).reshape((5, 0))
>>> d1[[]]
array([], dtype=int32)
>>> d2[[]]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: invalid index
>>> d2[[], 0]
array([], dtype=int32)
>>> d3[[]]
array([], shape=(0, 0), dtype=int32)
>>> d3[0, []]
array([], dtype=int32)
>>> d3[:, []]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: invalid index
Ticket?
Friedrich
More information about the NumPy-Discussion
mailing list