我有一个使用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]?
答案 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