从向量创建矩阵,其中每一行都是向量的移位版本 [英] Create a matrix from a vector where each row is a shifted version of the vector
问题描述
我有一个像这样的numpy数组
I have a numpy array like this
import numpy as np
ar = np.array([1, 2, 3, 4])
,我想创建一个看起来像这样的数组:
and I want to create an array that looks like this:
array([[4, 1, 2, 3],
[3, 4, 1, 2],
[2, 3, 4, 1],
[1, 2, 3, 4]])
因此,每一行对应于ar
,该行移位了行索引+ 1.
Thereby, each row corresponds to ar
which is shifted by the row index + 1.
一个简单的实现可能看起来像这样:
A straightforward implementation could look like this:
ar_roll = np.tile(ar, ar.shape[0]).reshape(ar.shape[0], ar.shape[0])
for indi, ri in enumerate(ar_roll):
ar_roll[indi, :] = np.roll(ri, indi + 1)
这给了我想要的输出.
我的问题是这样做是否有更聪明的方法来避免循环.
My question is whether there is a smarter way of doing this which avoids the loop.
推荐答案
这是使用 NumPy strides
基本是用剩余元素填充,然后strides
帮助我们非常有效地创建转换后的版本-
Here's one approach using NumPy strides
basically padding with the leftover elements and then the strides
helping us in creating that shifted version pretty efficiently -
def strided_method(ar):
a = np.concatenate(( ar, ar[:-1] ))
L = len(ar)
n = a.strides[0]
return np.lib.stride_tricks.as_strided(a[L-1:], (L,L), (-n,n))
样品运行-
In [42]: ar = np.array([1, 2, 3, 4])
In [43]: strided_method(ar)
Out[43]:
array([[4, 1, 2, 3],
[3, 4, 1, 2],
[2, 3, 4, 1],
[1, 2, 3, 4]])
In [44]: ar = np.array([4,9,3,6,1,2])
In [45]: strided_method(ar)
Out[45]:
array([[2, 4, 9, 3, 6, 1],
[1, 2, 4, 9, 3, 6],
[6, 1, 2, 4, 9, 3],
[3, 6, 1, 2, 4, 9],
[9, 3, 6, 1, 2, 4],
[4, 9, 3, 6, 1, 2]])
运行时测试-
In [5]: a = np.random.randint(0,9,(1000))
# @Eric's soln
In [6]: %timeit roll_matrix(a)
100 loops, best of 3: 3.39 ms per loop
# @Warren Weckesser's soln
In [8]: %timeit circulant(a[::-1])
100 loops, best of 3: 2.03 ms per loop
# Strides method
In [18]: %timeit strided_method(a)
100000 loops, best of 3: 6.7 µs per loop
制作副本(如果您想进行更改,而不仅仅是用作只读数组),对于strides
方法-
Making a copy (if you want to make changes and not just use as a read only array) won't hurt us too badly for the strides
method -
In [19]: %timeit strided_method(a).copy()
1000 loops, best of 3: 381 µs per loop
这篇关于从向量创建矩阵,其中每一行都是向量的移位版本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!