эффективный способ вычислить все возможные элементы умножения внутри вектора в numpy - PullRequest
1 голос
/ 13 апреля 2020

Есть ли эффективный способ сделать следующее: Предположим, у меня есть вектор A длины n, я хочу вычислить второй вектор B, где

B[i] = A[0] * A[1] * .. *A[i-1] * A[i+1] *..*A[n-1]

, т. Е. B [ i] - умножение всех элементов в A, кроме i'м вяза enet. Сначала я думал о том, чтобы сделать что-то вроде:

C = np.prod(A)
B = C/A

Но потом у меня возникла проблема, когда у меня есть элемент A, равный нулю. Конечно, я могу выяснить, есть ли у меня один ноль, а затем сразу установить B в качестве вектора, состоящего из всех нулей, за исключением этого единственного нуля, и поместить туда кратное от остальной части A, а в случае более 1 ноля - обнулить B полностью. Но это становится немного громоздким, когда я хочу выполнить эту операцию для каждой строки в матрице, а не только для одного вектора. Конечно, я могу сделать это в al oop, но мне было интересно, есть ли более эффективный способ?

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Возможен один вкладыш с использованием np.eye, np.tile и np.prod:

np.prod(np.tile(A, (A.size, 1))[(1 - np.eye(A.size)).astype(bool)].reshape(A.size, -1), axis=1) 
0 голосов
/ 13 апреля 2020

Вы можете нарезать до (но не включая) i, затем с i+1 и далее. Объедините эти кусочки вместе и умножьте.

np.prod(np.concatenate([a[:i], a[i+1:]]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...