Получить индексы массива, где выполняются два условия (для разных массивов) - PullRequest
2 голосов
/ 04 июля 2011

У меня есть два массива: a и b.Я хочу выбрать все индексы, где a == 1 и b == 0.

То есть, если у меня есть следующие массивы:

a = [0, 1, 3, 5, 1, 1, 2]

b = [1, 0, 2, 5, 3, 0, 6]

Я бы хотел получить следующие индексыназад:

[1, 5]

Как мне сделать это в numpy?Я попытался использовать следующее (предложенное в кратком справочнике, показывающем различия между numpy, matlab и IDL):

(a == 1 and b == 0).nonzero()

Но это дает ошибку о неоднозначности значений истинности.идеи?

Ответы [ 4 ]

12 голосов
/ 04 июля 2011
In []: a= array([0, 1, 3, 5, 1, 1, 2])
In []: b= array([1, 0, 2, 5, 3, 0, 6])
In []: logical_and(a== 1, b== 0).nonzero()[0]
Out[]: array([1, 5])

Очевидно, это также будет работать:

In []: ((a== 1)& (b== 0)).nonzero()[0]
Out[]: array([1, 5])
5 голосов
/ 04 июля 2011

Вот один из способов:

In [75]: import numpy as np

In [76]: a = np.array([0, 1, 3, 5, 1, 1, 2])

In [77]: b = np.array([1, 0, 2, 5, 3, 0, 6])

In [78]: np.argwhere((a==1) & (b==0)).flatten()
Out[78]: array([1, 5])
1 голос
/ 04 июля 2011

Попробуйте использовать следующий код:

import numpy

a = numpy.array([0, 1, 3, 5, 1, 1, 2])
b = numpy.array([1, 0, 2, 5, 3, 0, 6])

res =  [i for i,v in enumerate(zip(a,b)) if v == (1,0)]

print res
0 голосов
/ 04 июля 2011

Я не эксперт по ошибкам, но это то, что я бы сделал с обычными списками Python, и, возможно, вы могли бы использовать его и здесь:

>>> a = [0, 1, 3, 5, 1, 1, 2]
>>> b = [1, 0, 2, 5, 3, 0, 6]
>>> zip(a, b)
[(0, 1), (1, 0), (3, 2), (5, 5), (1, 3), (1, 0), (2, 6)]
>>> for i, tup in enumerate(zip(a, b)):
...     if tup[0]==1 and tup[1]==0:
...         print i
...
1
5
>>>

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...