我有矩陣 A (rxk) 和 B (mxk),我想將第一行的每一行 A[:,i] 全部添加到 B 中,并為第一行的每一行回傳一個單獨的矩陣(相當于 3d維數為 rxmxk 的矩陣)。IE:
import numpy as np
v = np.array([[1,2],[3,4]])
w = np.zeros((5,2))
def mysum(a,b):
return np.array([a[i] b for i in range(a.shape[0])])
mysum(v,w)
這將回傳所需的輸出,盡管速度很慢:
[array([[1., 2.],
[1., 2.],
[1., 2.],
[1., 2.],
[1., 2.]]),
array([[3., 4.],
[3., 4.],
[3., 4.],
[3., 4.],
[3., 4.]])]
我嘗試使用 in 中的axes引數np.add,但它不接受關鍵字。
有沒有一種矢量化的方式來做到這一點?如果沒有慢回圈,我無法弄清楚如何做到這一點for。我在溢位的其他地方讀到這apply_along_axis只是一個for變相的回圈,我的時序測驗表明,與上述串列理解解決方案相比,以下僅運行略少于一半的時間,而我在矢量化方面的經驗讓我相信很多更快的速度是可能的:
def notsofastsum(t,x):
return np.apply_along_axis(np.add,1,t,x)
而且我認為 usingvectorize不會起作用,因為我在檔案中發現了這一點:
提供矢量化功能主要是為了方便,而不是為了性能。該實作本質上是一個 for 回圈。
uj5u.com熱心網友回復:
你的陣列是:
In [193]: v.shape, w.shape
Out[193]: ((2, 2), (5, 2))
結果形狀: (2, 5, 2)
我們可以用它broadcasting來做到這一點:
In [195]: v[:,None,:] w # (2,1,2) (5,2)
Out[195]:
array([[[1., 2.],
[1., 2.],
[1., 2.],
[1., 2.],
[1., 2.]],
[[3., 4.],
[3., 4.],
[3., 4.],
[3., 4.],
[3., 4.]]])
您的回圈也使用broadcasting.
In [196]: v[0].shape
Out[196]: (2,)
它將 (2,) 形狀添加到 (5,2) - 這broadcasting是 (1,2) 添加到 (5,2) => (5,2)。你在 的第一個維度上的回圈上執行此操作v。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/526651.html
