簡體   English   中英

在Python中將列表的每個元素與另一個列表的每個元素相乘/添加/分配的有效方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM