gpt4 book ai didi

python - Numpy - 一维输入数组的多个 numpy.roll

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

我想返回 2D numpy.array具有给定 1D 的多个卷 numpy.array .

>>> multiroll(np.arange(10), [-1, 0, 1, 2])
array([[1., 0., 9., 8.],
[2., 1., 0., 9.],
[3., 2., 1., 0.],
[4., 3., 2., 1.],
[5., 4., 3., 2.],
[6., 5., 4., 3.],
[7., 6., 5., 4.],
[8., 7., 6., 5.],
[9., 8., 7., 6.],
[0., 9., 8., 7.]])

有没有numpy.roll的组合, numpy.tile , numpy.repeat ,或执行此操作的其他功能?

这是我尝试过的

def multiroll(array, rolls):
"""Create multiple rolls of 1D vector"""
m = len(array)
n = len(rolls)
shape = (m, n)
a = np.empty(shape)
for i, roll in enumerate(rolls):
a[:,i] = np.roll(array, roll)
return a

我期望有一种不使用循环的更“Numpythonic”的方式来做到这一点。

最佳答案

方法 #1:为了优雅

这是使用广播的一种方法-

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

In [45]: rolls
Out[45]: array([-1, 0, 1, 2])

In [46]: a[(np.arange(len(a))[:,None]-rolls) % len(a)]
Out[46]:
array([[1, 0, 9, 8],
[2, 1, 0, 9],
[3, 2, 1, 0],
[4, 3, 2, 1],
[5, 4, 3, 2],
[6, 5, 4, 3],
[7, 6, 5, 4],
[8, 7, 6, 5],
[9, 8, 7, 6],
[0, 9, 8, 7]])

方法 #2:内存/性能效率

想法主要来自 - this post .

我们可以利用 np.lib.stride_tricks.as_strided基于 scikit-image's view_as_windows获得滑动窗口。 More info on use of as_strided based view_as_windows .

from skimage.util.shape import view_as_windows

def multiroll_stridedview(a, r):
r = np.asarray(r)

# Concatenate with sliced to cover all rolls
a_ext = np.concatenate((a,a[:-1]))

# Get sliding windows; use advanced-indexing to select appropriate ones
n = len(a)
return view_as_windows(a_ext,n)[:,(n-r)%n]

关于python - Numpy - 一维输入数组的多个 numpy.roll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57272516/

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