假設我有一個矩陣:有沒有辦法讓這個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