首页 > 解决方案 > 如何对修改数据帧的每个元素的python for循环进行矢量化?

问题描述

我有一个 Python 脚本,使用 pandas 数据框,它通过转换另一个数据框的元素来填充数据框。我可以用一个简单的 for 循环或 itertuples 来做到这一点,但我想看看是否可以对其进行矢量化以获得最大速度(我的数据帧非常大,~60000x12000)。

这是我正在尝试做的一个例子:

    #Sample data
    sample_list=[1,2,5]

我有一个像上面那样的值列表。我的新矩阵中的每个元素都是该列表中某些两个元素的总和除以常数 n。

new_matrix[row,col]=(sample_list[row]+sample_list[col])/n

因此 n=2 的预期输出将是:

1   1.5 3
1.5 2   3.5
3   3.5 5

现在我使用 for 循环执行此操作,遍历空矩阵的每个元素并将它们设置为公式计算的值。有什么方法可以矢量化这个操作(即类似于new_matrix=2*old_matrix而不是 for row, col in range(): new_matrix[row,col]=2*old_matrix[row,col]?

标签: pythonpandasperformancenumpyvectorization

解决方案


首先将您的列表转换为数组:

arr = np.asarray(sample_list)

然后请注意,您的添加需要广播以产生 2D 输出。要向数组添加“虚拟”维度,请使用np.newaxis

arr[:,np.newaxis] + arr

这给了你:

array([[ 2,  3,  6],
       [ 3,  4,  7],
       [ 6,  7, 10]])

将其简单地除以 2 以获得最终结果。

反过来做会更有效,因为分区是 1D 而不是 2D:

arr = np.asarray(sample_list) / 2
arr[:,np.newaxis] + arr

推荐阅读