Numpy трансляция 3-й матрицы и 1-го вектора - PullRequest
0 голосов
/ 04 мая 2020

У меня есть матрица A формы (N, N, T). Тогда у меня есть вектор V shape (N,). Я хочу выполнить следующую операцию A[i, j, ...] = A[i, j, ...]*V[i]/V[j]. Я делаю это со следующим l oop, но уверен, что есть способ сделать это с широковещательной передачей.

A = np.random.randint(0, 5, (2, 2, 3))
V = np.array([2, 3]) 

for i in range(2):
    for j in range(2):
        A[i, j, ...] *= V[i]
        A[i, j, ...] /= V[j]

Я думал сделать это с поэлементным умножением и широковещательной передачей numpy, и я пробую подходы типа A * V[:, None, None], но всегда получаю ошибку.

Есть ли более эффективный способ сделать это?

1 Ответ

2 голосов
/ 04 мая 2020

Вот один из способов сделать это -

(A*V[:,None,None])/V[:,None]

Либо в два этапа -

A *= V[:,None,None]
A /= V[:,None]

Кредитное плечо multi-cores с numexpr -

import numexpr as ne
ne.evaluate('A*V3D/V2D',{'V3D':V[:,None,None],'V2D':V[:,None]})

Обратите внимание, что вы можете получить ошибку, потому что вы можете вносить изменения в массив int с результатами с плавающей запятой. Итак, либо преобразуйте в массив с плавающей точкой в ​​начале, либо запишите в новый массив с помощью одношаговых подходов.

...