[英]Efficient way to multiply/add/devide each element of a list with each element of another list in Python
我想將列表的每個元素與另一個列表的每個元素相乘。
lst1 = [1, 2, 1, 2]
lst2 = [2, 2, 2]
lst3 = []
for item in lst1:
for i in lst2:
rs = i * item
lst3.append(rs)
這可行,但這在大型數據集中效率非常低,並且可能需要很長時間才能完成循環。 請注意,這兩個列表的長度可能會有所不同。
我很喜歡使用非內置數據結構。 我檢查了numpy,似乎在ndarray
有廣播的ndarray
。 我不確定它是否可行。 到目前為止,將數組乘以標量按預期工作。
arr = np.arange(3)
arr * 2
返回:
array([0, 2, 4])
但是它們與另一個陣列的工作方式有點不同,我似乎無法實現上述目標。
我想這肯定是直截了當的,但我似乎無法找到目前所需的確切解決方案。 任何輸入都將受到高度贊賞。 謝謝。
順便說一句,有一個方案類似的問題,而不考慮效率這里
編輯:謝謝你的回答。 乘法有效,請參閱Dval的答案。 但是,我也需要做同樣的添加和可能的分割。 出於這個原因,我稍微更新了一下問題。
編輯:我可以使用numpy數組本身,所以我不需要將列表轉換為數組並返回。
Numpy是要走的路,特別是numpy.outer ,它將每個元素的乘積作為矩陣返回。 使用.flatten()將其壓縮為1d。
import numpy
lst1 = numpy.array([1, 2, 1, 2])
lst2 = numpy.array([2, 2, 2])
numpy.outer(lst1, lst2).flatten()
要添加到更新的問題,添加似乎以類似的方式工作:
numpy.add.outer(lst1, lst2).flatten()
像這樣的陣列上的線性運算是numpy
的肉食。 一旦定義了數組,對它們的矩陣操作就很簡單,而且相對較快。 這包括外部產品和內部(矩陣)產品,以及逐個元素的操作。
例如:
In [133]: a=np.array([1,2,1,2])
In [134]: b=np.array([2,2,2])
雙循環的列表推導版本:
In [135]: [i*j for i in a for j in b]
Out[135]: [2, 2, 2, 4, 4, 4, 2, 2, 2, 4, 4, 4]
使用廣播的numpy產品。 認為一個a[:,None]
車削a
進入的列向量。
In [136]: a[:,None]*b
Out[136]:
array([[2, 2, 2],
[4, 4, 4],
[2, 2, 2],
[4, 4, 4]])
元素划分的元素也有效
In [137]: a[:,None]/b
Out[137]:
array([[ 0.5, 0.5, 0.5],
[ 1. , 1. , 1. ],
[ 0.5, 0.5, 0.5],
[ 1. , 1. , 1. ]])
但是在組合操作時這會變得更有用。
將列表轉換為數組會有開銷,因此我不建議將其用於偶爾的小型計算。
使用numpy - 它是為復雜的基於矩陣的算法設計的庫。
import numpy
lst1 = numpy.array([1, 2, 1, 2])
lst2 = numpy.array([2, 2, 2]]
numpy.outer(lst1, lst2)
您可以使用列表理解來實現此目的:
lst1 = [1, 2, 1, 2]
lst2 = [2, 2, 2]
lst3 = [x * y for x in lst1 for y in lst2]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.