Нахождение индексов значений в двумерном массиве - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь получить значения индекса из массива numpy, я пытался использовать пересечения, но безрезультатно.Я просто пытаюсь найти одинаковые значения в 2 массивах.Один - 2D, и я выбираю столбец, а другой - 1D, просто список значений для поиска, так что фактически всего 2 1D массива.

Мы будем называть этот массив a:

 array([[    1, 97553,     1],
       [    1, 97587,     1],
       [    1, 97612,     1],
       [    1, 97697,     1],
       [    1, 97826,     3],
       [    1, 97832,     1],
       [    1, 97839,     1],
       [    1, 97887,     1],
       [    1, 97944,     1],
       [    1, 97955,     2]])

И мы ищем, скажем, values = numpy.array([97612, 97633, 97697, 97999, 97943, 97944])

Поэтому я пытаюсь:

numpy.where(a[:, 1] == values)

И я бы ожидал несколько индексов значений, но вместо этогоЯ получаю пустой массив, он выплевывает [(array([], dtype=int64),)].

Если я попробую это, хотя:

numpy.where(a[:, 1] == 97697)

Это возвращает мне (array([2]),), что я и ожидал.

Что за странности массивов я здесь упускаю?Или, может быть, даже более простой способ сделать это?Поиск индексов массивов и сопоставление массивов, кажется, не работают, как я ожидаю вообще.Когда я хочу найти объединения или пересечения массивов, по индексу или уникальному значению это просто не работает.Любая помощь будет супер.Спасибо.

Редактировать: По запросу Уоррена:

import numpy

a = numpy.array([[    1, 97553,     1],
       [    1, 97587,     1],
       [    1, 97612,     1],
       [    1, 97697,     1],
       [    1, 97826,     3],
       [    1, 97832,     1],
       [    1, 97839,     1],
       [    1, 97887,     1],
       [    1, 97944,     1],
       [    1, 97955,     2]])

values = numpy.array([97612, 97633, 97697, 97999, 97943, 97944])

Я обнаружил, что numpy.in1d даст мне правильную таблицу истинности логических значений для операциис массивом 1d той же длины, который должен отображаться на исходные данные.Моя единственная проблема здесь - теперь, как действовать с этим, например, удаляя или изменяя исходный массив с этими индексами.Я мог бы сделать это кропотливо с помощью цикла, но, насколько я знаю, есть лучшие способы в NumPy.Таблицы правды в виде масок должны быть достаточно мощными и бесстыдными из того, что я смог найти.

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Просто мысль:

Попробуйте сгладить 2D-массив и сравнить, используя numpy.intersect1d.

https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.ndarray.flatten.html

https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.intersect1d.html

0 голосов
/ 25 июня 2018

np.where с одним аргументом эквивалентно np.nonzero.Он дает вам индексы, где условие, входной массив, равно True.

В вашем примере вы проверяете поэлементное равенство между a[:,1] и values

a[:, 1] == values
False

Таким образом, он дает вам правильный результат: никакой индекс на входе не равен True.

Вы должны использовать np.isin вместо

np.isin(a[:,1], values)
array([False, False,  True,  True, False, False, False, False,  True, False], dtype=bool)

Теперь вы можете использовать np.where, чтобы получить индексы

np.where(np.isin(a[:,1], values))
(array([2, 3, 8]),)

и использовать их для обращения к исходному массиву

a[np.where(np.isin(a[:,1], values))]    
array([[    1, 97612,     1],
       [    1, 97697,     1],
       [    1, 97944,     1]])

Ваше первоначальное решение с простой проверкой равенства действительно могло бы работать с правильными broadcasting:

np.where(a[:,1] == values[..., np.newaxis])[1]
array([2, 3, 8])

РЕДАКТИРОВАТЬ : учитывая, что у вас, похоже, есть проблемы с использованием приведенных выше результатов для индексации и манипулирования вашим массивом, вот пара простых примеров

Теперь у вас должно быть два способа доступа к соответствующим элементам в исходном массиве, либодвоичная маска или индексы от np.where.

mask = np.isin(a[:,1], values)  # np.in1d if np.isin is not available
idx = np.where(mask)

Допустим, вы хотите установить все соответствующие строкив ноль

a[mask] = 0   # or a[idx] = 0
array([[    1, 97553,     1],
       [    1, 97587,     1],
       [    0,     0,     0],
       [    0,     0,     0],
       [    1, 97826,     3],
       [    1, 97832,     1],
       [    1, 97839,     1],
       [    1, 97887,     1],
       [    0,     0,     0],
       [    1, 97955,     2]])

Или вы хотите умножить третий столбец соответствующих строк на 100

a[mask, 2] *= 100
array([[    1, 97553,     1],
       [    1, 97587,     1],
       [    1, 97612,   100],
       [    1, 97697,   100],
       [    1, 97826,     3],
       [    1, 97832,     1],
       [    1, 97839,     1],
       [    1, 97887,     1],
       [    1, 97944,   100],
       [    1, 97955,     2]])

Или вы хотите удалить соответствующие строки (здесь использование индексов удобнее, чеммаски)

np.delete(a, idx, axis=0)
array([[    1, 97553,     1],
       [    1, 97587,     1],
       [    1, 97826,     3],
       [    1, 97832,     1],
       [    1, 97839,     1],
       [    1, 97887,     1],
       [    1, 97955,     2]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...