在Python

时间:2015-10-26 22:59:56

标签: python numpy data-structures

我想将列表中的每个元素与另一个列表中的每个元素相乘。

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数组本身,所以我不需要将列表转换为数组并返回。

4 个答案:

答案 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