Numpy .dot на нескольких парах матриц - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть два списка матриц [numpy .ndarray]: (a1, a2, a3 ....., an) и (b1, b2, b3 ......, bn), каждый из которых квадратная матрица некоторого размера, не все матрицы имеют одинаковый размер, и не все матрицы b имеют одинаковый размер, но гарантируется, что dim (a [i]) == dim (b [i ]) (что означает, что мы умножаем только матрицы одинакового размера).

Я хочу поставить их в точках соответственно: a1 * b1, a2 * b2 ..... an * bn и сохранить результаты в скажем c1, c2 .... и т. д. есть ли способ сделать это, кроме как пройти пары 1 на 1 в a для l oop?

im, в настоящее время использующего:

# a_list and b_list contain n matrices each
# a[i] & b[i] are numpy.ndarray objects
a_list = [a1,a2,.....]
b_list = [b1,b2,.....]
result_list = []
for i in range(n):
    result_list.append(numpy.dot(a_list[i],b_list[i])

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Я думаю, что принятым решением является syntacti c sugar для a для l oop, однако мы можем найти более интересный вариант здесь.

Технически, что мы хотим, это массив numpy numpy массивы, позволяющие нам выполнять векторизованные операции между ними, аналогично тому, как np.array ([1,2,3]) * np.array ([3,4,5]) выполняет скалярное умножение между каждым элементом.

Итак, нам нужен массив numpy из массивов numpy, за исключением того, что мы хотим, чтобы оператор * определялся как матричное умножение вместо поэлементного умножения. Интересно отметить, что это относится к классу np.matrix. Однако важно отметить, что этот класс устарел и может вызывать сложности , но в случае полного изучения / понимания вещей, мы можем попробовать использовать этот класс ..

import nummpy as np
b_0 = np.asmatrix(np.arange(9).reshape(3, 3))

# b_0 = 0 1 2
#       3 4 5
#       6 7 8

b_1 = np.asmatrix(np.arange(4).reshape(2, 2))

# b_1 = 0 1
#       2 3   

a_0 = np.asmatrix(np.eye(3))
a_1 = np.asmatrix(np.eye(2))
a = np.asarray([a_0, a_1])
b = np.asarray([b_0, b_1])
a * b # We get [b_0, b_1])

Если бы это была важная опция syntacti c, вы могли бы написать собственный класс, который был бы совместим с массивами numpy (и, следовательно, не использовал бы np.matrix). Однако, вероятно, это будет немного медленнее, чем использование простого старого для l oop с np.dot.

2 голосов
/ 20 апреля 2020

Вы можете использовать python список понимания:

result_list = [a.dot(b) for a, b in zip(a_list, b_list)]
...