Я думаю, что принятым решением является 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.