[Numpy-discussion] just curious...why does numpy.where() return tuples?

Robert Kern robert.kern at gmail.com
Mon Sep 8 17:01:30 EDT 2008


On Mon, Sep 8, 2008 at 15:14, Mark Miller <markperrymiller at gmail.com> wrote:
> Just for my own benefit, I am curious about this.
>
> I am running into problems because I need to archive the result (tuple)
> returned by a numpy.where statement.  Pickle does not seem to like to deal
> with numpy scalars, and numpy's archiving functions (memmap) can't work on
> the tuple that gets returned by the where functions (I think).
>
> Is there a way around this?  All would be good if the where statements
> actually returned numpy arrays instead.

I assume that you are talking about where()'s single-argument form
which is equivalent to nonzero() (which I recommend using instead).
The reason that it returns a tuple is that the result is intended to
be usable as a "fancy" index. E.g.

In [4]: x = random.randint(0, 2, [3, 10])

In [5]: x
Out[5]:
array([[1, 0, 0, 0, 0, 0, 1, 1, 0, 0],
       [1, 1, 0, 0, 1, 1, 1, 0, 0, 1],
       [1, 0, 0, 1, 0, 1, 0, 1, 0, 1]])

In [6]: nonzero(x)
Out[6]:
(array([0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2]),
 array([0, 6, 7, 0, 1, 4, 5, 6, 9, 0, 3, 5, 7, 9]))

In [7]: x[nonzero(x)]
Out[7]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])


In Python, x[i,j] is implicitly x[(i,j)]. In order to support both
x[i,j] and x[some_array] (i.e., some_array is an array indexing on the
first axis only), we differentiate the inputs by type.


In [8]: x[array(nonzero(x))]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)

/Users/rkern/svn/shell/ShellIO/<ipython console> in <module>()

IndexError: index (6) out of range (0<=index<2) in dimension 0


If you want to use memmap or numpy.lib.format to save your data, then
I recommend explicitly casting to an array, and possibly converting
back to a tuple when you read it again.

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless
enigma that is made terrible by our own mad attempt to interpret it as
though it had an underlying truth."
 -- Umberto Eco



More information about the NumPy-Discussion mailing list