#python #arrays #numpy
#python #массивы #numpy
Вопрос:
У меня есть массив объектов Numpy типа <type 'numpy.ndarray'>
,
>>> xt4
array([['D', 'F'], ['B', 'C', 'E']], dtype=object)
Но когда я ищу определенное значение в массиве, используя numpy.where , оно ничего не возвращает, несмотря на то, что оно присутствует.
>>> numpy.where(xt4=='D')
(array([], dtype=int32),)
Вместо этого я ожидал соответствующий [row]/[col]
индекс этого значения из массива. Это отлично работает int
, но терпит неудачу, когда я ищу строку в массиве объектов.
Редактировать 1
- У меня нет контроля над массивом объектов, и он вряд ли будет квадратным.
- Мне нужен
[row]/[col]
индекс значения, присутствующего вnd.array
.
Ответ №1:
У вас есть одномерный массив объектов, и ==
оператор этой команды просто попытается сопоставить объект с объектом. Самый простой способ увидеть это так:
>>> xt4=='D'
array([False, False], dtype=bool)
Numpy попытался сопоставить D
с ['D', 'F']
и ['B', 'C', 'E']
. У вас может быть массив символов следующим образом:
>>> arr = np.array([['D', 'F', 'G'], ['B', 'C', 'E']])
>>> arr
array([['D', 'F', 'G'],
['B', 'C', 'E']],
dtype='|S1')
Где любой вид логической индексации будет работать просто отлично:
>>> arr=='D'
array([[ True, False, False],
[False, False, False]], dtype=bool)
>>> np.where(arr=='D')
(array([0]), array([0]))
Комментарии:
1. Я понимаю, что вы имеете в виду, но у меня нет никакого контроля над массивом объектов. Следовательно, есть ли какой-либо способ, которым я могу выполнить поиск значения в массиве и получить соответствующий индекс?
2. @PankajParashar Вы делаете это с помощью циклов python, но я не верю, что для этого есть встроенная функция. Плюс «строка / строка» для позиции здесь не имеет особого смысла, вы не можете использовать процедуры индексации numpy для доступа к
D
элементу.3. Да. Я могу использовать циклы for, но объем, с которым я имею дело, огромен и достигает 100 тыс. Следовательно, я хотел максимально избегать циклов for .
4. Кроме того, я не понимаю, почему позиция строки / столбца не имеет для вас смысла? В этом случае ожидаемый ответ должен быть row = 0, col = 0, что будет полезно для того, что я буду делать дальше. Имело ли это смысл :-)?
5. @PankajParashar Массив numpy обычно представляет собой непрерывный фрагмент данных в памяти. Массив объектов numpy — это просто массив указателей. Если вы не сможете преобразовать свои данные в не-объектный массив, большинство подпрограмм numpy не будут работать для вас. Рассмотрите возможность поиска в blaze неоднородных массивов.
Ответ №2:
Ваша проблема в том, что NumPy на самом деле не поддерживает неровные массивы в том же смысле, что и другие. Вы можете создавать их, но они не всегда выполняются так, как вы ожидаете.
Если каждая строка в массиве имеет одинаковую длину, то она выполняется так, как ожидалось.
>>> xt4 = array([['D', 'F'], ['B', 'C']], dtype=object)
>>> numpy.where(xt4=='D')
(array([0]), array([0]))
Комментарии:
1. Согласен. Он по-прежнему не отвечает на мой вопрос 🙂 Также обновил мой вопрос для большей ясности.