[Numpy-discussion] numpy where function on different sized arrays

David Warde-Farley d.warde.farley at gmail.com
Sat Nov 24 19:34:17 EST 2012

```On Sat, Nov 24, 2012 at 7:08 PM, David Warde-Farley <
d.warde.farley at gmail.com> wrote:

> I think that would lose information as to which value in B was at each
> position. I think you want:
>
>
(premature send, stupid Gmail...)

idx = {}
for i, x in enumerate(a):
for j, y in enumerate(x):
if y in B:
idx.setdefault(y, []).append((i,j))

On the problem size the OP specified, this is about 4x slower than the
NumPy version I posted above. However with a small modification:

idx = {}
set_b = set(B)  # makes 'if y in B' lookups much faster
for i, x in enumerate(a):
for j, y in enumerate(x):
if y in set_b:
idx.setdefault(y, []).append((i,j))

It actually beats my solution. With inputs: np.random.seed(0); A =
np.random.random_integers(40, 59, size=(40, 60)); B = np.arange(40, 60)

In [115]: timeit foo_py_orig(A, B)
100 loops, best of 3: 16.5 ms per loop

In [116]: timeit foo_py(A, B)
100 loops, best of 3: 2.5 ms per loop

In [117]: timeit foo_numpy(A, B)
100 loops, best of 3: 4.15 ms per loop

Depending on the specifics of the inputs, a collections.DefaultDict could
also help things.

> On Sat, Nov 24, 2012 at 5:23 PM, Daπid <davidmenhur at gmail.com> wrote:
>
>> A pure Python approach could be:
>>
>> for i, x in enumerate(a):
>>         for j, y in enumerate(x):
>>                 if y in b:
>>                         idx.append((i,j))
>>
>> Of course, it is slow if the arrays are large, but it is very
>> readable, and probably very fast if cythonised.
>>
>>
>> David.
>>
>> On Sat, Nov 24, 2012 at 10:19 PM, David Warde-Farley
>> <d.warde.farley at gmail.com> wrote:
>> > M = A[..., np.newaxis] == B
>> >
>> > will give you a 40x60x20 boolean 3d-array where M[..., i] gives you a
>> > boolean mask for all the occurrences of B[i] in A.
>> >
>> > If you wanted all the (i, j) pairs for each value in B, you could do
>> > something like
>> >
>> > import numpy as np
>> > from itertools import izip, groupby
>> > from operator import itemgetter
>> >
>> > id1, id2, id3 = np.where(A[..., np.newaxis] == B)
>> > order = np.argsort(id3)
>> > triples_iter = izip(id3[order], id1[order], id2[order])
>> > grouped = groupby(triples_iter, itemgetter(0))
>> > d = dict((b_value, [idx[1:] for idx in indices]) for b_value, indices in
>> > grouped)
>> >
>> > Then d[value] is a list of all the (i, j) pairs where A[i, j] == value,
>> and
>> > the keys of d are every value in B.
>> >
>> >
>> >
>> > On Sat, Nov 24, 2012 at 3:36 PM, Siegfried Gonzi <
>> sgonzi at staffmail.ed.ac.uk>
>> > wrote:
>> >>
>> >> Hi all
>> >>
>> >> This must have been answered in the past but my google search
>> capabilities
>> >> are not the best.
>> >>
>> >> Given an array A say of dimension 40x60 and given another array/vector
>> B
>> >> of dimension 20 (the values in B occur only once).
>> >>
>> >> What I would like to do is the following which of course does not work
>> (by
>> >> the way doesn't work in IDL either):
>> >>
>> >> indx=where(A == B)
>> >>
>> >> I understand A and B are both of different dimensions. So my question:
>> >> what would the fastest or proper way to accomplish this (I found a
>> solution
>> >> but think is rather awkward and not very scipy/numpy-tonic tough).
>> >>
>> >> Thanks
>> >> --
>> >> The University of Edinburgh is a charitable body, registered in
>> >> Scotland, with registration number SC005336.
>> >>
>> >> _______________________________________________
>> >> NumPy-Discussion mailing list
>> >> NumPy-Discussion at scipy.org
>> >> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>> >
>> >
>> >
>> > _______________________________________________
>> > NumPy-Discussion mailing list
>> > NumPy-Discussion at scipy.org
>> > http://mail.scipy.org/mailman/listinfo/numpy-discussion
>> >
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion at scipy.org
>> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20121124/44da9fb8/attachment.html>
```