Python 与努比不同,熊猫没有';我似乎不喜欢记忆的飞跃

Python 与努比不同,熊猫没有';我似乎不喜欢记忆的飞跃,python,arrays,pandas,numpy,dataframe,Python,Arrays,Pandas,Numpy,Dataframe,Pandas似乎缺少一个R样式的矩阵级滚动窗口函数(rollapply(…,by.column=FALSE)),只提供基于向量的版本。因此,我尝试遵循这个示例,它可以很好地进行复制,但即使在使用基础Numpy数组(看起来完全相同)的情况下,它也不适用于pandasDataFrames 人工问题复制: import numpy as np import pandas as pd from numpy.lib.stride_tricks import as_strided test = [[x *

Pandas似乎缺少一个R样式的矩阵级滚动窗口函数(
rollapply(…,by.column=FALSE)
),只提供基于向量的版本。因此,我尝试遵循这个示例,它可以很好地进行复制,但即使在使用基础Numpy数组(看起来完全相同)的情况下,它也不适用于pandas
DataFrame
s

人工问题复制:

import numpy as np
import pandas as pd
from numpy.lib.stride_tricks import as_strided

test = [[x * y for x in range(1, 10)] for y in [10**z for z in range(5)]]
mm = np.array(test, dtype = np.int64)
pp = pd.DataFrame(test).values
mm
pp
看起来相同:

numpy直接导出的矩阵完美地满足了我的需求:

as_strided(mm, (mm.shape[0] - 3 + 1, 3, mm.shape[1]), (mm.shape[1] * 8, mm.shape[1] * 8, 8))
也就是说,在一个3d矩阵中,它给了我3步,每一步3行,允许我在一个子矩阵上执行计算,每次向下移动一行

但是熊猫衍生版本(与
mm
相同的调用被
pp
替换):

这一切都很奇怪,好像它被调换了。这与列/行主订单有关吗

我需要在熊猫中制作矩阵滑动窗口,这似乎是我的最佳拍摄,特别是因为它真的很快。这是怎么回事?如何使底层Pandas数组的行为类似于Numpy

这与列/行主订单有关吗

是,请参见
mm.strips
pp.strips

如何使底层Pandas数组的行为类似于Numpy


Numpy数组
mm
是“C-连续”的,这就是跨步技巧起作用的原因。如果要在数据帧底层的数组上调用完全相同的代码,可以先使用
np.ascontiguousarray
。或者,在编写数据窗口时,最好考虑数组
步长
项目大小

似乎
.values
以Fortran顺序返回基础数据(如您推测的):

这就混淆了
,因为_大步前进
,它期望数据在内存中按C顺序排列

要解决问题,您可以按C顺序复制数据,并使用与问题中相同的步幅:

pp = pp.copy('C') 
或者,如果要避免复制大量数据,请调整步长以确认数据的列顺序布局:

as_strided(pp, (pp.shape[0] - 3 + 1, 3, pp.shape[1]), (8, 8, pp.shape[0]*8))
pp = pp.copy('C') 
as_strided(pp, (pp.shape[0] - 3 + 1, 3, pp.shape[1]), (8, 8, pp.shape[0]*8))