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]])