3 回答

TA貢獻2041條經(jīng)驗 獲得超4個贊
matmul
接受一個out參數(shù)
如果p_list
是ndarray
帶形狀的N, 3
,那么您可以一次完成整個乘法matmul
:
np.matmul(p_list, R.T, out=p_list)

TA貢獻1815條經(jīng)驗 獲得超6個贊
以@sacul的示例為例:
In [59]: R.shape
Out[59]: (3, 3)
In [60]: p_list.shape
Out[60]: (2, 3)
In [58]: np.array([np.matmul(R,p) for p in p_list])
Out[58]:
array([[1.54190819, 2.86411033, 2.13484841],
[3.7506842 , 6.75463885, 4.89299192]])
einsum 生成相同的(新的)數(shù)組而沒有外部循環(huán):
In [61]: np.einsum('ij,kj->ki',R,p_list)
Out[61]:
array([[1.54190819, 2.86411033, 2.13484841],
[3.7506842 , 6.75463885, 4.89299192]])
和一樣ufunc,它接受一個out參數(shù):
In [63]: np.einsum('ij,kj->ki',R,p_list, out=p_list)
Out[63]:
array([[1.54190819, 2.86411033, 2.13484841],
[3.7506842 , 6.75463885, 4.89299192]])
In [64]: p_list
Out[64]:
array([[1.54190819, 2.86411033, 2.13484841],
[3.7506842 , 6.75463885, 4.89299192]])
我確定它使用了一個中間緩沖區(qū),但是應(yīng)該比逐行迭代要快。與使用out相比,讓它返回一個新數(shù)組要慢一些。
進行尺寸調(diào)整后,matmul可以在一個調(diào)用中執(zhí)行整個計算(關(guān)鍵是將的最后一個暗角R與第二個和最后一個暗角配對p_list(已修改))。
In [84]: (R@p_list[:,:,None])[:,:,0]
Out[84]:
array([[1.54190819, 2.86411033, 2.13484841],
[3.7506842 , 6.75463885, 4.89299192]])
添加回答
舉報