2015-05-19 3 views
3

Может кто-нибудь объяснить, почему происходит следующее? Мой вариант использования заключается в том, что у меня есть список python, чьи элементы - все numpy ndarray objects, и мне нужно выполнить поиск по списку, чтобы найти индекс конкретного ndarray obj.Найти индекс массива numpy в списке

Простейшее Пример:

>>> import numpy as np 
>>> a,b = np.arange(0,5), np.arange(1,6) 
>>> a 
array([0, 1, 2, 3, 4]) 
>>> b 
array([1, 2, 3, 4, 5]) 
>>> l = list() 
>>> l.append(a) 
>>> l.append(b) 
>>> l.index(a) 
0 
>>> l.index(b) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Почему l найти индекс a, но не b?

+0

Что происходит в этом коде? – WuJo

+3

Обычно эта ошибка возникает, когда вы пытаетесь выполнить булевую операцию Python ('in', 'if') в булевом массиве 'numpy' (или списке). например 'if [True, False ...]:'. Здесь я подозреваю, что один идентификатор 'index' соответствует идентификаторам, другой пытается проверить' == '. Кажется, зависит от того, как создается список. – hpaulj

+0

Операции с индексными операциями с массивами 'numpy', вероятно, не очень хорошая идея. – hpaulj

ответ

4

Применяя идею в https://stackoverflow.com/a/17703076/901925 (см Родственный sidebare)

[np.array_equal(b,x) for x in l].index(True) 

должны быть более надежными. Он обеспечивает правильный массив для сравнения массива.

Или [id(b)==id(x) for x in l].index(True), если вы хотите, чтобы он сравнивал идентификаторы.

0

Идея заключается в том, чтобы преобразовать Numpy массивов в списки и трансформировать проблему нахождения списка в другой список:

def find_array(list_of_numpy_array,taregt_numpy_array): 
    out = [x.tolist() for x in list_of_numpy_array].index(taregt_numpy_array.tolist()) 
    return out 
Смежные вопросы