我想将列表中的每个元素与另一个列表中的每个元素相乘。
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
中有一种称为广播的方式。我不确定它是否可行。到目前为止,将数组乘以标量符合预期。
arr = np.arange(3)
arr * 2
返回:
array([0, 2, 4])
但他们使用另一个阵列的方式有点不同,我似乎无法实现上述目标。
我想这肯定是直截了当的,但我现在似乎无法找到确切的解决方案。任何输入都将受到高度赞赏。感谢。
顺便说一下,在没有考虑效率here
的情况下,Scheme也有类似的问题编辑:谢谢你的回答。乘法有效,请参阅Dval的答案。但是,我也需要做同样的添加和可能的分割。出于这个原因,我稍微更新了一些问题。
编辑:我可以使用numpy数组本身,所以我不需要将列表转换为数组并返回。
答案 0 :(得分:3)
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()
答案 1 :(得分:2)
像这样的数组上的线性运算是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. ]])
但是在组合操作时这会变得更有用。
将列表转换为数组会有开销,因此我不建议将其用于偶尔的小型计算。
答案 2 :(得分:1)
使用numpy - 它是专为复杂的基于矩阵的算法而设计的库。
import numpy
lst1 = numpy.array([1, 2, 1, 2])
lst2 = numpy.array([2, 2, 2]]
numpy.outer(lst1, lst2)
答案 3 :(得分:-3)
您可以使用列表理解来实现此目的:
for i in range(len(df) // 4):
for j in range(4):
df.timestamp.iloc[i * 4 + j] += j / samples_per_sec