np. умножить "где" условие на c? - PullRequest
0 голосов
/ 07 мая 2020

Мне нужно умножить два массива numpy поэлементно, и вместо использования a * b я заинтересован в использовании np.multiply из-за его опции «где», которая должна помочь мне сэкономить некоторые вычислительные ресурсы. время. Фактически, меня интересует a * b только тогда, когда третий массив, c, принимает значения> 0.

Фактически, a, b и c принимают значения только в {0,1 }, поэтому они являются массивами "int8", и все они имеют размерность> 3.

Итак, я установил np.multiply (a, b where = c), а c изменен на тип данных "bool ". Иногда кажется, что функция работает, но иногда она выдает абсолютно бессмысленные числа в некоторых записях, например, 123 или -42 или что-то еще. Пытаясь выяснить, почему, у меня также был этот вывод с некоторыми меньшими массивами:

a,b = np.random.choice(10,size=(4,4)),np.random.choice(10,size=(4,4))

c = np.random.choice(2,size=(4,4)).astype("bool")

a

> array([[9, 6, 5, 0],
       [6, 3, 7, 9],
       [0, 4, 0, 7],
       [1, 9, 1, 9]])

b

> array([[9, 9, 2, 7],
       [8, 6, 2, 4],
       [7, 9, 6, 5],
       [8, 4, 1, 0]])


c

> array([[ True,  True,  True, False],
       [ True,  True,  True, False],
       [ True, False,  True, False],
       [False,  True,  True,  True]])


np.multiply(a,b,where=c)

> array([[81, 54, 10,  1],
       [48, 18, 14,  1],
       [ 0,  1,  0,  1],
       [ 1, 36,  1,  0]])

Где c - «False», результат не 0, а 1.

Что Что-то не так с этой функцией?

РЕДАКТИРОВАТЬ: Я указываю, что в моем приложении функции, a и b не имеют одинаковой формы, но умножение все еще возможно и, без опции where, возвращает правильный результат .

1 Ответ

0 голосов
/ 07 мая 2020

Согласно do c, если where равно False, соответствующие местоположения останутся неинициализированными. В вашем случае вы можете просто сделать:

a*b*c.astype(int)

Или, если вы хотите использовать np.multiply, вы должны инициализировать параметр out:

np.multiply(a,b,where=c, out=np.zeros_like(a))

Вывод:

array([[81, 54, 10,  0],
       [48, 18, 14,  0],
       [ 0,  0,  0,  0],
       [ 0, 36,  1,  0]])
...