【问题标题】:How to vectorize python for loop that modifies each element of a dataframe?如何对修改数据帧的每个元素的python for循环进行矢量化?
【发布时间】:2019-11-05 09:35:01
【问题描述】:

我有一个 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]?

【问题讨论】:

  • 你试过new_matrix=2*old_matrix吗?发生了什么?这通常是正确的方法。如果您发布一个最小的相同输入数据集和预期的输出结果供我们使用,这将有很大帮助。
  • new_matrix=2*old_matrix 不是我的公式,我的意思是将其作为矢量化的示例。我试图向量化的公式是第二个代码块。我会用预期的输出更新我的帖子。

标签: python pandas performance numpy vectorization


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2015-06-25
    相关资源
    最近更新 更多