python - 如何对修改数据帧的每个元素的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]?
解决方案
首先将您的列表转换为数组:
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
推荐阅读
- javascript - 使用 .toFixed() 仅在需要时显示 3 位小数
- java - 每当更新 MySQL 表时更新 JFrame
- reactjs - 对于反应虚拟化的砌体,处理删除项目的推荐方法是什么?
- r - 如何在同一个中绘制多个轮廓
- javascript - 有没有人可以使用我的密钥创建帐户?
- c# - Asp mvc 5 集成测试 SpecsFor.Mvc
- c# - Task.WaitAll 超时时如何获得未完成的任务?
- javascript - 点击时为willWatch 添加 +1
- android - 数据绑定 onClick 不起作用
- android - Appcelerator - Android:隐藏状态栏和导航栏