Python 3.x 熊猫在使用转置的numpy矩阵时会加速

Python 3.x 熊猫在使用转置的numpy矩阵时会加速,python-3.x,pandas,performance,numpy,transpose,Python 3.x,Pandas,Performance,Numpy,Transpose,我试图找出在numpy和pandas之间标准化日期的更快方法,并使用整个矩阵/数据帧或逐列,我在下面的代码中发现了这种奇怪的行为 将熊猫作为pd导入 将numpy作为np导入 def支架(df): res=pd.DataFrame() 对于df中的col: res[col]=(df[col]-df[col].min())/df[col].max() 返回res 矩阵=pd.DataFrame(np.random.randint(0174000,size=(1000000100))) 矩阵形状 (

我试图找出在
numpy
pandas
之间标准化日期的更快方法,并使用整个矩阵/数据帧或逐列,我在下面的代码中发现了这种奇怪的行为

将熊猫作为pd导入
将numpy作为np导入
def支架(df):
res=pd.DataFrame()
对于df中的col:
res[col]=(df[col]-df[col].min())/df[col].max()
返回res
矩阵=pd.DataFrame(np.random.randint(0174000,size=(1000000100)))
矩阵形状
(1000000, 100)
%timeit res=(矩阵-matrix.min(axis=0))/matrix.max(axis=0)
每个回路2.64 s±22.4 ms(7次运行的平均值±标准偏差,每个回路1次)
%计时器(矩阵)
每个回路5.32 s±12.9 ms(7次运行的平均值±标准偏差,每个回路1次)
但当从一个“翻转”的numpy矩阵开始,并将其转置以创建数据帧时

matrix=pd.DataFrame(np.random.randint(0174000,size=(1001000000)).T)
矩阵形状
(1000000, 100)
%timeit res=(矩阵-matrix.min(axis=0))/matrix.max(axis=0)
每个回路2.37 s±18.5 ms(7次运行的平均值±标准偏差,每个回路1次)
%计时器(矩阵)
每个回路1.2 s±8.06 ms(7次运行的平均值±标准偏差,每个回路1次)
一列一列地执行标准化的速度提高了约4倍

此行为仍然使用
.values
numpy
操作,如下所示:

%timeit res=(matrix.values-matrix.min(axis=0).values)/matrix.max(axis=0).values
每个回路2.58 s±417 ms(7次运行的平均值±标准偏差,每个回路1次)
%计时器(矩阵)
每个回路5.26 s±42.4 ms(7次运行的平均值±标准偏差,每个回路1次)
%timeit res=np.除法(np.减法(矩阵值,矩阵最小值(轴=0).值),矩阵最大值(轴=0).值)
每个回路2.17 s±7.32 ms(7次运行的平均值±标准偏差,每个回路1次)
#翻转矩阵转置
矩阵=pd.DataFrame(np.random.randint(0174000,size=(1001000000)).T)
矩阵形状
(1000000, 100)
%timeit res=(matrix.values-matrix.min(axis=0).values)/matrix.max(axis=0).values
每个回路2.2 s±8.82 ms(7次运行的平均值±标准偏差,每个回路1次)
%计时器(矩阵)
每个回路1.33 s±190 ms(7次运行的平均值±标准偏差,每个回路1次)
%timeit res=np.除法(np.减法(矩阵值,矩阵最小值(轴=0).值),矩阵最大值(轴=0).值)
每个回路2.46 s±166 ms(7次运行的平均值±标准偏差,每个回路1次)

有人能解释为什么从反向矩阵开始,然后在创建数据帧之前对其进行转置会改变性能吗?从非反向矩阵开始的w.r.t.

转置数组具有
order='F'
,列顺序。与数据帧的系列方向相匹配的。您的
stand
函数正在跨列迭代,一次处理一列或一系列。转置的数组具有
order='F'
,列顺序。与数据帧的系列方向相匹配的。您的
stand
函数正在跨列迭代,一次处理一列或一系列。