gpt4 book ai didi

python - 沿 2D 数组的最后一个轴滑动窗口以使用 NumPy strides 给出 3D 数组

转载 作者:太空宇宙 更新时间:2023-11-04 05:06:36 24 4
gpt4 key购买 nike

我正在尝试使用 numpy.lib.stride_tricks 中的函数 as_strided 从更大的二维数组中提取子系列,但我很难找到正确的方法为 strides 参数编写。

假设我有一个矩阵 m,其中包含 5 个长度为 (a=)10 的一维数组。我想为 m 中的每个一维数组提取长度为 (b=)4 的子一维数组。

import numpy
from numpy.lib.stride_tricks import as_strided

a, b = 10, 4
m = numpy.array([range(i,i+a) for i in range(5)])

# first try
sub_m = as_strided(m, shape=(m.shape[0], m.shape[1]-b+1, b))
print sub_m.shape # (5,7,4) which is what i expected
print sub_m[-1,-1,-1] # Some unexpected strange number: 8227625857902995061

# second try with strides argument
sub_m = as_strided(m, shape=(m.shape[0], m.shape[1]-b+1, b), strides=(m.itemize,m.itemize,m.itemize))
# gives error, see below

AttributeError: 'numpy.ndarray' object has no attribute 'itemize'

如您所见,我在第一次尝试中就成功地获得了 sub_m 的正确形状。但是我找不到要在 strides=()

中写的内容

信息:

m = [[ 0  1  2  3  4  5  6  7  8  9]
[ 1 2 3 4 5 6 7 8 9 10]
[ 2 3 4 5 6 7 8 9 10 11]
[ 3 4 5 6 7 8 9 10 11 12]
[ 4 5 6 7 8 9 10 11 12 13]]

预期输出:

sub_n = [
[[0 1 2 3] [1 2 3 4] ... [5 6 7 8] [6 7 8 9]]
[[1 2 3 4] [2 3 4 5] ... [6 7 8 9] [7 8 9 10]]
[[2 3 4 5] [3 4 5 6] ... [7 8 9 10] [8 9 10 11]]
[[3 4 5 6] [4 5 6 7] ... [8 9 10 11] [9 10 11 12]]
[[4 5 6 7] [5 6 7 8] ... [9 10 11 12] [10 11 12 13]]
]

edit:我有更多数据,这就是我想使用 as_strided(效率)的原因

最佳答案

这是 np.lib.stride_tricks.as_strided 的一种方法-

def strided_lastaxis(a, L):
s0,s1 = a.strides
m,n = a.shape
return np.lib.stride_tricks.as_strided(a, shape=(m,n-L+1,L), strides=(s0,s1,s1))

关于 as_strided 步幅的一些解释:

我们有 3D 步幅,它沿着最后一个/第三个轴递增一个元素,所以 s1 那里是最后一个轴步幅。第二个轴跨越相同的一个元素“距离”,因此 s1 也是如此。对于第一个轴,步幅与数组的第一个轴步幅长度相同,因为我们移动到下一行,所以 s0 在那里。

sample 运行-

In [46]: a
Out[46]:
array([[0, 5, 6, 2, 3, 6, 7, 1, 4, 8],
[2, 1, 3, 7, 0, 3, 5, 4, 0, 1]])

In [47]: strided_lastaxis(a, L=4)
Out[47]:
array([[[0, 5, 6, 2],
[5, 6, 2, 3],
[6, 2, 3, 6],
[2, 3, 6, 7],
[3, 6, 7, 1],
[6, 7, 1, 4],
[7, 1, 4, 8]],

[[2, 1, 3, 7],
[1, 3, 7, 0],
[3, 7, 0, 3],
[7, 0, 3, 5],
[0, 3, 5, 4],
[3, 5, 4, 0],
[5, 4, 0, 1]]])

关于python - 沿 2D 数组的最后一个轴滑动窗口以使用 NumPy strides 给出 3D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44305987/

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