Поиск в массивах объектов numpy

#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

  1. У меня нет контроля над массивом объектов, и он вряд ли будет квадратным.
  2. Мне нужен [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. Согласен. Он по-прежнему не отвечает на мой вопрос 🙂 Также обновил мой вопрос для большей ясности.