假设我有一个矩阵:
现在考虑一个更一般化的情况:
A = [[2, 1]
[1, 2]]
还有一个矩阵列表:
B = [[1, 0] C = [[2, 1], D = [[0, 0], E = [[1, 0],
[1, 0]] [0, 0]] [0, 0]] [0, 0]]
首先,我希望将A.flatten() = [2 1 1 2]
展平。然后,对这些元素分别乘以B
、C
、D
和E
,并将它们的和求出来。因此:
A[0] * B + A[1]*C + A[2]*D + A[3]*E
现在考虑一个更一般化的情况:
A[0] * X_1 + A[1] * X_2 + ... + A[n-1] * X_n
在这里,X_n
可以有任何维度。这是我想到的代码:
import numpy as np
from functools import reduce
from operator import mul
def product(iterable):
return reduce(mul, iterable)
def create_table(old_shape, new_shape):
# Create X_1, X_2, ..., X_n
lookup = []
for _ in range(product(old_shape)):
lookup.append(np.random.rand(*new_shape))
return lookup
def sum_expansion(arr, lookup, shape):
# A[0] * X_1 + ... + A[n-1] * X_n
new_arr = np.zeros(shape)
for i, a in enumerate(arr.flatten()):
new_arr += a * lookup[i]
return new_arr
if __name__ == '__main__':
lookup = create_table((2, 2), (3, 3, 3))
# Generate random 2 x 2 matrices.
randos = (np.random.rand(2, 2) for _ in range(100000))
results = map(lambda x: sum_expansion(x, lookup, (3, 3, 3)), randos)
print(list(results))
在我的机器上执行此代码大约需要74秒。有没有办法缩短代码执行时间?