如果我有一個 NumPy 陣列 [abcd],有沒有辦法獲得每個元素與除自身之外的所有其他元素且沒有重復項的乘法之和?
例如,這個陣列的總和是:ab ac ad bc bd cd。
使用 for 回圈是一種選擇,但當您有非常大的陣列時,它不會很有效。所以我想知道 NumPy 中是否有更有效的方法。
uj5u.com熱心網友回復:
使用數學,您可以將積的總和重構為總和的積。
a*b a*c a*d b*c b*d c*d
(a b c)*d (a b)*c a*b
這為您提供以下資訊:
out = (a[1:]*np.cumsum(a[:-1])).sum()
或者更好的是,使用矩陣乘法:
out = a[1:] @ a[:-1].cumsum()
例子:
a = np.array([3, 6, 4, 9, 10])
np.triu(a*a[:,None], k=1).sum()
# 391
a[1:] @ a[:-1].cumsum()
# 391
uj5u.com熱心網友回復:
這是對@mozwy 使用上三角形的想法的測驗。
一個示例陣列:
In [11]: x = np.array([1,2,3,4]); a,b,c,d = x
產品總和:
In [12]: a*b a*c a*d b*c b*d c*d
Out[12]: 35
上三:
In [13]: A = np.triu(np.ones((4,4),int),k=1)
In [14]: A
Out[14]:
array([[0, 1, 1, 1],
[0, 0, 1, 1],
[0, 0, 0, 1],
[0, 0, 0, 0]])
和矩陣產品:
In [15]: x@A@x
Out[15]: 35
另一種方法,從完整的外部產品開始:
In [17]: outer = x[:,None]*x
In [18]: outer
Out[18]:
array([[ 1, 2, 3, 4],
[ 2, 4, 6, 8],
[ 3, 6, 9, 12],
[ 4, 8, 12, 16]])
洗掉跟蹤,您將得到兩倍的結果:
In [19]: np.trace(outer) # or x@x
Out[19]: 30
In [20]: (np.sum(outer)-np.trace(outer))/2
Out[20]: 35.0
等效地使用einsum:
In [25]: (np.einsum('i,j->',x,x)-np.einsum('i,i',x,x))/2
Out[25]: 35.0
用numpy它來做外積的全部總和很容易,而且相對有效;“向量化”意味著在編譯的代碼中進行整個陣列計算,即使意味著一些“額外的”作業和記憶體使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/514927.html
上一篇:在C函式中回傳字符陣列
下一篇:如何迭代陣列以計算元素PHP?
