如何对修改数据框每个元素的python for循环进行矢量化处理?

时间:2019-06-23 07:46:05

标签: python pandas performance numpy vectorization

我有一个使用pandas数据框的Python脚本,该脚本通过转换另一个数据框的元素来填充数据框。我可以使用简单的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]?

1 个答案:

答案 0 :(得分:2)

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

arr = np.asarray(sample_list)

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

arr[:,np.newaxis] + arr

那给你:

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

将其中的数字除以2得到最终结果。

反之亦然,因为除法是在一维而不是二维中进行,所以效率更高。

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