假设我有一个矩阵:有没有办法让这个numpy数组操作更快?
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秒在我的机器上。有什么办法可以减少这段代码的时间?
我怀疑这74秒中的大部分都花在实际打印结果上。 –
Ahh geez哈哈。我认为你是对的(为了确保它仍然要进行更多的调查)回到绘图中,我的其他程序中有一个瓶颈,我认为我已经隔离了它并创建了MVE。谢谢! – Dair
我用'%run'在'ipython'中运行,并且在打印之前花了很长时间。印刷相对较快。但除了做了10万次之外,什么是如此之慢? – hpaulj