我想返回一个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”的方式来做这件事,不使用循环。
3条答案
按热度按时间wfsdck301#
**方法#1:为了优雅
这里有一种处理
broadcasting
的方法-方法#2:内存/性能效率
主要是借用了-
this post
的想法。我们可以利用基于
scikit-image's view_as_windows
的np.lib.stride_tricks.as_strided
来获得滑动窗口. More info on use ofas_strided
basedview_as_windows
。kmb7vmvb2#
方法#3:为了数学之美(和效率?)
在频域中使用fft核可以一次处理整个矩阵。这种方法只适用于整数
我们得到:
您可以在此处获得有关此代码如何工作的更多信息
对于左循环移位,您可以用途:
没有负号。
zsohkypk3#
另一种方法based on this answer。