gpt4 book ai didi

python - 使用 numpy.lib.stride_tricks.as_strided 填充 NaN 元素的滑动窗口

转载 作者:太空宇宙 更新时间:2023-11-03 15:59:04 26 4
gpt4 key购买 nike

考虑数组a

import numpy as np
import pandas as pd

np.random.seed([3,1415])
a = np.random.randint(100, size=10)
print(a)

[11 98 74 90 15 55 13 11 13 26]

我正在使用 as_strided from numpy.lib.stride_tricks import as_strided

当我用它来给出如下滚动窗口时

as_strided(a, shape=(len(a), 5), strides=(8, -8))

[[11 0 0 0 0]
[98 11 0 0 0]
[74 98 11 0 0]
[90 74 98 11 0]
[15 90 74 98 11]
[55 15 90 74 98]
[13 55 15 90 74]
[11 13 55 15 90]
[13 11 13 55 15]
[26 13 11 13 55]]

这几乎是完美的。我想在顶部三角形中使用 np.nan 而不是零。

我要这个

[[ 11.  nan  nan  nan  nan]
[ 98. 11. nan nan nan]
[ 74. 98. 11. nan nan]
[ 90. 74. 98. 11. nan]
[ 15. 90. 74. 98. 11.]
[ 55. 15. 90. 74. 98.]
[ 13. 55. 15. 90. 74.]
[ 11. 13. 55. 15. 90.]
[ 13. 11. 13. 55. 15.]
[ 26. 13. 11. 13. 55.]]

有没有方便的方法告诉 as_stridednp.nan 代替

最佳答案

诀窍是在前面加上 NaN,然后​​跨越它。可能有两种跨步方式——通过使用适当的步幅向前和向后。设置所需输出的方式,我们需要沿着每一行向后跨步。另一种方法是向前迈进,获得 2D 输出并最终翻转列,尽管它会慢一点。因此,使用前向方法,我们将像往常一样沿每一行有正步幅,而向后步幅为负步幅。

因此,strides 的两种方法是 -

from numpy.lib.stride_tricks import as_strided as strided 

def strided_nan_filled(a, W):
a_ext = np.concatenate(( np.full(W-1,np.nan) ,a))
n = a_ext.strides[0]
return strided(a_ext, shape=(a.size,W), strides=(n,n))[:,::-1]

def strided_nan_filled_v2(a, W):
a_ext = np.concatenate(( np.full(W-1,np.nan) ,a))
n = a_ext.strides[0]
return strided(a_ext[W-1:], shape=(a.size,W), strides=(n,-n))

sample 运行-

In [42]: a
Out[42]: array([11, 98, 74, 90, 15, 55, 13, 11, 13, 26])

In [43]: strided_nan_filled(a, 5)
Out[43]:
array([[ 11., nan, nan, nan, nan],
[ 98., 11., nan, nan, nan],
[ 74., 98., 11., nan, nan],
[ 90., 74., 98., 11., nan],
[ 15., 90., 74., 98., 11.],
[ 55., 15., 90., 74., 98.],
[ 13., 55., 15., 90., 74.],
[ 11., 13., 55., 15., 90.],
[ 13., 11., 13., 55., 15.],
[ 26., 13., 11., 13., 55.]])

运行时测试-

In [74]: a = np.random.randint(0,9,(1000))

In [75]: %timeit strided_nan_filled(a, 5)
10000 loops, best of 3: 30.1 µs per loop

In [76]: %timeit strided_nan_filled_v2(a, 5)
10000 loops, best of 3: 28.7 µs per loop

关于python - 使用 numpy.lib.stride_tricks.as_strided 填充 NaN 元素的滑动窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41520327/

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