求数组元素两两相乘的全向量化实现方案(生成指定结构DataFrame)
全向量化实现数组元素两两相乘生成DataFrame
直接用numpy的外积函数或者pandas的广播机制就能完全替代循环,实现全向量化运算,效率更高:
方法一:利用numpy外积(最简洁)
import pandas as pd import numpy as np data = {'values': [0.7, 0.1, 0.5, 0.7]} df = pd.DataFrame.from_dict(data) # 直接计算外积,生成两两乘积的二维数组,再转成DataFrame products = pd.DataFrame(np.outer(df['values'], df['values']))
np.outer(arr1, arr2)会直接生成一个二维数组,其中第i行第j列的元素就是arr1[i] * arr2[j],完全匹配你需要的结构:第一列是a1a1、a1a2...,第二列是a2a1、a2a2...。
方法二:利用pandas广播机制
import pandas as pd import numpy as np data = {'values': [0.7, 0.1, 0.5, 0.7]} df = pd.DataFrame.from_dict(data) # 将一维数组转为列向量,和原数组广播相乘 values = df['values'].to_numpy() products = pd.DataFrame(values[:, np.newaxis] * values)
这里values[:, np.newaxis]把原一维数组转成形状为(4,1)的列向量,和原一维数组(形状(4,))相乘时,pandas/numpy会自动触发广播机制,将两个数组扩展为(4,4)的二维数组后逐元素相乘,得到的结果和循环实现完全一致,但全程无循环。
这两种方法都属于全向量化运算,避免了Python层面的循环,在数据量较大时性能优势会非常明显。
内容的提问来源于stack exchange,提问作者user20501139
相关产品推荐
相关产品推荐

