Как я могу найти индекс кортежа внутри массива numpy? - PullRequest
1 голос
/ 27 июня 2019

У меня есть массив NumPy как:

groups=np.array([('Species1',), ('Species2', 'Species3')], dtype=object).

Когда я спрашиваю np.where(groups == ('Species2', 'Species3')) или даже np.where(groups == groups[1]), я получаю пустой ответ: (array([], dtype=int64),)

Почему это так и как я могу получить индексы для такого элемента?

Ответы [ 4 ]

1 голос
/ 27 июня 2019

Проблема здесь, вероятно, в том, как реализован array.__contains__().Смотрите здесь .В основном проблема в том, что

print(('Species2', 'Species3') in groups)

печатает False.Тем не менее, если вы хотите использовать функцию numpy.where, а не цикл for, как предлагает другой ответ, вероятно, лучше всего как-то создать подходящую маску правды.Например,

x = np.array(list(map(lambda x: x== ('Species2', 'Species3'), groups)))
print(np.where(x))

дает правильный результат.Хотя может быть более элегантный способ.

1 голос
/ 27 июня 2019

Это не означает поиск кортежа ('Species2', 'Species3') в группах при использовании

np.where(groups == ('Species2', 'Species3'))

это означает, что вы будете искать 'Species2' и 'Species3' отдельно, если у вас есть полный массив, подобный этому

groups=np.array([('Species1',''), ('Species2', 'Species3')], dtype=object)

1 голос
/ 27 июня 2019

Да, вы можете искать его, но не с помощью np.where, а с помощью петли for и if-else

for index,var in enumerate(groups):
    if var == ('Species2', 'Species3'):
        print("('Species2', 'Species3') -->>", index)
    else:
        print("('Species1',) -->>", index)

Вывод

('Species1',) -->> 0
('Species2', 'Species3') -->> 1
0 голосов
/ 27 июня 2019

Ваш массив состоит из двух кортежей:

In [53]: groups=np.array([('Species1',), ('Species2', 'Species3')], dtype=object)                    
In [54]: groups                                                                                      
Out[54]: array([('Species1',), ('Species2', 'Species3')], dtype=object)
In [55]: groups.shape                                                                                
Out[55]: (2,)

Но будьте осторожны с такого рода определениями. Если бы кортежи были одного размера, массив имел бы другую форму, и элементы больше не были бы кортежами.

In [56]: np.array([('Species1',), ('Species2',), ('Species3',)], dtype=object)                       
Out[56]: 
array([['Species1'],
       ['Species2'],
       ['Species3']], dtype=object)
In [57]: _.shape                                                                                     
Out[57]: (3, 1)

Любое использование where только так же хорошо, как и логический массив, данный ему. Это where возвращает пустое значение, потому что тест на равенство производит все False:

In [58]: np.where(groups == groups[1])                                                               
Out[58]: (array([], dtype=int64),)
In [59]: groups == groups[1]                                                                         
Out[59]: array([False, False])

Если я использую понимание списка для сравнения элементов группы:

In [60]: [g == groups[1] for g in groups]                                                            
Out[60]: [False, True]
In [61]: np.where([g == groups[1] for g in groups])                                                  
Out[61]: (array([1]),)

Но для такого рода вещей список был бы таким же хорошим

In [66]: alist = [('Species1',), ('Species2', 'Species3')]                                           
In [67]: alist.index(alist[1])                                                                       
Out[67]: 1
In [68]: alist.index(('Species1',))                                                                  
Out[68]: 0
In [69]: alist.index(('Species2',))                                                                  
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-69-0b16b56ad28c> in <module>
----> 1 alist.index(('Species2',))

ValueError: ('Species2',) is not in list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...