np.where, возвращающий пустой индекс для списка кортежей - PullRequest
0 голосов
/ 20 июня 2019

Может кто-нибудь сказать мне, как исправить следующий код?np.where должен вернуть индекс 0.

import numpy as np
listoftups=[("a", "b"), ("n"), ("c","d","e"), ("f", "g")]
np.where(listoftups==("a", "b"))

Ответы [ 3 ]

4 голосов
/ 20 июня 2019
np.where(('a','b') in listoftups)

То, что у вас есть в коде, возвращает false

>>> listoftups==("a", "b")
False

Где как,

>>> ('a','b') in listoftups
True
2 голосов
/ 20 июня 2019

Предполагается, что вы пытаетесь найти индекс кортежа. Вот решение, которое не требует numpy.

listoftups=[("a", "b"), ("n"), ("c","d","e"), ("f", "g")]
search_tuple = ("a", "b")
print(listoftups.index(search_tuple))

Вернет 0

search_tuple = ("f", "g")
print(listoftups.index(search_tuple))

Вернет 3

0 голосов
/ 20 июня 2019

Вот как заставить numpy делать то, что вы хотите:

listoftups=[("a", "b"), ("n"), ("c","d","e"), ("f", "g")]
  1. where работает с логическими массивами, сравнение типа a == b создаст логический массив, если a или b это пустой массив, но не если оба являются нативными объектами Python. Давайте также создадим пример с двумя вхождениями поискового кортежа.

.

arroftups = np.array(listoftups)
twice = np.concatenate(2*[listoftups])
  1. Одной из незначительных проблем является предотвращение попытки широковещательной передачи при обнаружении двухэлементного тестового набора. Мы можем сделать это, заключив его в массив 0d

.

probe = np.empty((),object)
probe[()] = "a", "b"
  1. Теперь мы готовы идти:

.

np.where(arroftups==probe)
# (array([0]),)
np.where(twice==probe)
# (array([0, 4]),)

Обратите внимание: если вы уверены, что в тестовом кортеже есть только один случай, решение @ Watchdog101, вероятно, будет лучше. Но это не будет работать в общем случае.

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