Выборочно установить значения в массиве numpy (или при условии) - PullRequest
2 голосов
/ 13 февраля 2020
a = np.array([[0, 2, 0, 0], [0, 1, 3, 0], [0, 0, 10, 11], [0, 0, 1, 7]])
array([[ 0,  2,  0,  0],
       [ 0,  1,  3,  0],
       [ 0,  0, 10, 11],
       [ 0,  0,  1,  7]])

В каждой строке 0 записей. Мне нужно присвоить значение каждой из этих нулевых записей, где значение рассчитывается следующим образом:

V = 0.1 * Si / Ni

where Si is the sum of row i
      Ni is the number of zero entries in row i

Я могу довольно легко рассчитать Si и Ni:

S = np.sum(a, axis=1)
array([ 2,  4, 21,  8])

N = np.count_nonzero(a == 0, axis=1)
array([3, 2, 2, 2])

Теперь, V рассчитывается как:

V = 0.1 * S/N
array([0.06666667, 0.2       , 1.05      , 0.4       ])

Но как мне назначить V [i] для нуля записи в i -ой строке? Итак, я ожидаю получить следующий массив a:

array([[ 0.06666667,  2,  0.06666667,  0.06666667],
       [ 0.2,  1,  3,  0.2],
       [ 1.05,  1.05, 10, 11],
       [ 0.4,  0.4,  1,  7]])

Мне нужна какая-то операция или назначение выборочного вещания?

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

Использовать np.where

np.where(a == 0, v.reshape(-1, 1), a)

array([[ 0.06666667,  2.        ,  0.06666667,  0.06666667],
       [ 0.2       ,  1.        ,  3.        ,  0.2       ],
       [ 1.05      ,  1.05      , 10.        , 11.        ],
       [ 0.4       ,  0.4       ,  1.        ,  7.        ]])
1 голос
/ 13 февраля 2020

Вот способ использования np.where:

z = a == 0
np.where(z, (0.1*a.sum(1)/z.sum(1))[:,None], a)

array([[ 0.06666667,  2.        ,  0.06666667,  0.06666667],
       [ 0.2       ,  1.        ,  3.        ,  0.2       ],
       [ 1.05      ,  1.05      , 10.        , 11.        ],
       [ 0.4       ,  0.4       ,  1.        ,  7.        ]])
0 голосов
/ 13 февраля 2020

Может быть, с использованием маски:

for i in range(V.size):
    print((a[i,:] == 0) * V[i] + a[i,:])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...