如何对修改数据帧的每个元素的循环进行矢量化 python?
How to vectorize python for loop that modifies each element of a dataframe?
我有一个 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]?
首先将您的列表转换为数组:
arr = np.asarray(sample_list)
然后请注意,您的添加需要广播以产生 2D 输出。要向数组添加 "virtual" 维度,请使用 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
我有一个 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]?
首先将您的列表转换为数组:
arr = np.asarray(sample_list)
然后请注意,您的添加需要广播以产生 2D 输出。要向数组添加 "virtual" 维度,请使用 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