【问题标题】:Sliding windows of NaN padded elements with numpy.lib.stride_tricks.as_strided带有 numpy.lib.stride_tricks.as_strided 的 NaN 填充元素的滑动窗口
【发布时间】:2017-01-07 10:20:48
【问题描述】:

考虑数组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 代替

【问题讨论】:

  • 您得到的那些零超出了a's 内存空间,因此可以是任何东西。在您的情况下,它恰好是零。也与此相关 - stackoverflow.com/questions/40683601
  • @Divakar 吓人。好东西我问了。 :-)

标签: python numpy


【解决方案1】:

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

因此,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))

示例运行 -

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

【讨论】:

    猜你喜欢
    • 2016-08-16
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多