Numpy присваивает значение массива на основе значений другого массива с выбранным столбцом на основе вектора - PullRequest
1 голос
/ 21 мая 2019

У меня есть двумерный массив

X
array([[2, 3, 3, 3],
       [3, 2, 1, 3],
       [2, 3, 1, 2],
       [2, 2, 3, 1]])

и одномерный массив

y
array([1, 0, 0, 1])

Для каждой строки X я хочу найти индекс столбца, где X имеет наименьшее значение, а y имеет значение 1, и установить для соответствующей пары столбцов строк в третьей матрице значение 1

Например, в случае первой строки X индекс столбца, соответствующий минимальному значению X (только для первой строки) и y = 1, равен 0, тогда я хочу Z [0,0] = 1 и все остальные Z [0, i] = 0. Аналогично, для второй строки индекс столбца 0 или 3 дает наименьшее значение X при y = 1. Затем я хочу либо Z [1,0], либо Z [1,3] = 1 (предпочтительно Z [1,0] = 1 и все остальные Z [1, i] = 0, поскольку столбец 0 является первым вхождением)

Мой окончательный массив Z будет выглядеть как

Z
array([[1, 0, 0, 0],
       [1, 0, 0, 0],
       [1, 0, 0, 0],
       [0, 0, 0, 1]])

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Один из способов сделать это - использовать маскированные массивы.

import numpy as np

X = np.array([[2, 3, 3, 3],
              [3, 2, 1, 3],
              [2, 3, 1, 2],
              [2, 2, 3, 1]])

y = np.array([1, 0, 0, 1])
#get a mask in the shape of X. (True for places to ignore.)
y_mask = np.vstack([y == 0] * len(X))

X_masked = np.ma.masked_array(X, y_mask)

out = np.zeros_like(X)

mins = np.argmin(X_masked, axis=0)
#Output: array([0, 0, 0, 3], dtype=int64)

#Now just set the indexes to 1 on the minimum for each axis.
out[np.arange(len(out)), mins] = 1

print(out)
[[1 0 0 0]
 [1 0 0 0]
 [1 0 0 0]
 [0 0 0 1]]
0 голосов
/ 21 мая 2019

вы можете использовать numpy.argmin(), чтобы получить индексы минимального значения в каждой строке X. Например:

import numpy as np
a = np.arange(6).reshape(2,3) + 10
ids = np.argmin(a, axis=1)

Аналогично, вы можете индексировать, где y равен 1, либо numpy.nonzero, либо numpy.where. Если у вас есть два индексных массива, установить значения в третьем массиве будет довольно просто.

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