gpt4 book ai didi

python - numpy:通过沿新轴滚动并使用第二个数组中给出的变量移位来广播数组

转载 作者:行者123 更新时间:2023-12-01 01:28:02 24 4
gpt4 key购买 nike

我知道numpy.roll可以沿一个或多个现有轴移动数组。如何在数组 x 上创建一个新轴,沿着该轴我希望数组 shift 滚动其自身的 View 或副本?

示例:

x = np.arange(10)
shift = np.array([2, 4])

#input
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

#output
array(
[[8, 6],
[9, 7],
[0, 8],
[1, 9],
[2, 0],
[3, 1],
[4, 2],
[5, 3],
[6, 4],
[7, 5]])

编辑:我正在寻找一个通用的解决方案(最好没有循环),它也可以应用于更高维的数组。另一个例子:

x = np.arange(20).reshape(2, 10)
shift = np.array([2, 4])

#input
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])

#output
array(
[[[ 8, 6],
[ 9, 7],
[ 0, 8],
[ 1, 9],
[ 2, 0],
[ 3, 1],
[ 4, 2],
[ 5, 3],
[ 6, 4],
[ 7, 5]],

[[18, 16],
[19, 17],
[10, 18],
[11, 19],
[12, 10],
[13, 11],
[14, 12],
[15, 13],
[16, 14],
[17, 15]]])

最佳答案

这是一个利用广播的矢量化解决方案,涵盖通用n-dim数组情况 -

np.take(x,(-shift + np.arange(x.shape[-1])[:,None]),axis=-1)

示例运行

1) x1D -

In [114]: x = np.arange(10)
...: shift = np.array([2, 4])

In [115]: np.take(x,(-shift + np.arange(x.shape[-1])[:,None]),axis=-1)
Out[115]:
array([[8, 6],
[9, 7],
[0, 8],
[1, 9],
[2, 0],
[3, 1],
[4, 2],
[5, 3],
[6, 4],
[7, 5]])

2) x2D -

In [116]: x = np.arange(20).reshape(2, 10)
...: shift = np.array([2, 4])

In [117]: np.take(x,(-shift + np.arange(x.shape[-1])[:,None]),axis=-1)
Out[117]:
array([[[ 8, 6],
[ 9, 7],
[ 0, 8],
[ 1, 9],
[ 2, 0],
[ 3, 1],
[ 4, 2],
[ 5, 3],
[ 6, 4],
[ 7, 5]],

[[18, 16],
[19, 17],
[10, 18],
[11, 19],
[12, 10],
[13, 11],
[14, 12],
[15, 13],
[16, 14],
[17, 15]]])

关于python - numpy:通过沿新轴滚动并使用第二个数组中给出的变量移位来广播数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53176222/

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