2014-09-18 2 views
0

Хотя подобные вопросы были подняты пару раз, все же я не могу сделать функцию, аналогичную функции matlab ismember в Python. В частности, я хочу использовать эту функцию в цикле и сравнивать на каждой итерации целую матрицу с элементом другой матрицы. Если же значение, что происходит, я хочу, чтобы напечатать 1 и в любом другом случае 0.Функция matlab ismember в python

Пусть говорят, что у меня есть следующие матрицы

d = np.reshape(np.array([ 2.25, 1.25, 1.5 , 1. , 0. , 1.25, 1.75, 0. , 1.5 , 0. ]),(1,10)) 
d_unique = np.unique(d) 

тогда я

d_unique 
array([ 0. , 1. , 1.25, 1.5 , 1.75, 2.25]) 

Теперь я хотите перебрать как

J = np.zeros(np.size(d_unique)) 
for i in xrange(len(d_unique)): 
     J[i] = np.sum(ismember(d,d_unique[i])) 

так, чтобы взять в качестве выхода:

J = [3,1,2,2,1,1] 

Есть ли у кого-нибудь идеи? Спасибо заранее.

+0

Ответы на [этот вопрос] (http://stackoverflow.com/questions/10741346/numpy-frequency-counts-for-unique-values-in-an-array) помогают? – Evert

+0

Также по теме: http://stackoverflow.com/questions/1273041/how-can-i-implement-matlabs-ismember-command-in-python?rq=1 – Evert

ответ

1

Попробуйте следующую функцию:

def ismember(A, B): return [ np.sum(a == B) for a in A ]

Это должно очень вести себя как соответствующую функцию Matlab.

+0

О, это было очень просто в конце. Однако почему numpy не сравнивает числа один за другим? Когда я пытался выполнить итерацию по всей матрице, у меня появилось следующее предупреждение: «ValueError: значение истинности массива с несколькими элементами неоднозначно. Использование функции a.any() или a.all() ' – GiorgosR

+1

numpy имеет встроенную функцию для этого, зачем использовать медленное представление списка? Я добавил ответ ниже. – yuval

1

Чтобы ответить на ваш вопрос, я думаю, вы могли бы определить IsMember аналогично:

def ismember(d, k): 
    return [1 if (i == k) else 0 for i in d] 

Но я не знаком с NumPy, поэтому немного adjustement может быть в порядке.

Я думаю, вы могли бы также использовать счетчик из коллекций:

>>> from collections import Counter 
>>> a = [2.25, 1.25, 1.5, 1., 0., 1.25, 1.75, 0., 1.5, 0. ] 
>>> Counter(a) 
Counter({0.0: 3, 1.25: 2, 1.5: 2, 2.25: 1, 1.0: 1, 1.75: 1}) 
>>> Counter(a).keys() 
[2.25, 1.25, 0.0, 1.0, 1.5, 1.75] 
>>> c =Counter(a) 
>>> [c[i] for i in sorted(c.keys())] 
[3, 1, 2, 2, 1, 1] 

Еще раз, не NumPy, вы, вероятно, придется сделать некоторые list(d) где-то.

+0

Большое спасибо, он работает очень хорошо с вашим вторым примером , Первый пример - это именно то, что я пытался сделать, но в конце у меня появилось следующее предупреждение: «ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all() ». Я не понимаю, что это может означать. – GiorgosR

+0

@gioR При попытке вашего кода я должен использовать 'd [0]', а не просто 'd' – fredtantini

3

В отличие от других ответов, numpy имеет встроенный numpy.in1d для этого.

Использование в вашем случае:

bool_array = numpy.in1d(array1, array2) 

Примечание: также принимает списки в качестве входных данных.

Смежные вопросы