gpt4 book ai didi

python - 与 Numpy 不同,Pandas 似乎不喜欢内存步幅

转载 作者:太空狗 更新时间:2023-10-29 20:42:07 25 4
gpt4 key购买 nike

Pandas 似乎缺少 R 风格的矩阵级滚动窗口函数 (rollapply(..., by.column = FALSE)),仅提供基于向量的版本。因此我试着关注 this question它与可以复制的示例配合得很好,但它不适用于 pandas DataFrame,即使在使用(看似相同的)底层 Numpy 数组时也是如此。

人为问题复制:

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

mmpp 看起来相同:

enter image description here

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 行,允许我对子矩阵一次向下移动一行执行计算。

enter image description here

但是 pandas 派生版本(用 mm 替换为 pp 的相同调用):

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

enter image description here

很奇怪,就像以某种方式调换了一样。这与列/行主要订单有关吗?

我需要在 Pandas 中做矩阵滑动窗口,这似乎是我最好的选择,尤其是因为它真的很快。这里发生了什么?如何让底层的 Pandas 数组表现得像 Numpy?

最佳答案

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

>>> mm.flags # NumPy array
C_CONTIGUOUS : True
F_CONTIGUOUS : False
...

>>> pp.flags # array from DataFrame
C_CONTIGUOUS : False
F_CONTIGUOUS : True
...

这混淆了 as_strided,它期望数据在内存中按 C 顺序排列。

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

pp = pp.copy('C') 

或者,如果您想避免复制大量数据,请调整步幅以确认数据的列顺序布局:

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

关于python - 与 Numpy 不同,Pandas 似乎不喜欢内存步幅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29673396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com