从向量创建矩阵,其中每一行都是向量的移位版本 [英] Create a matrix from a vector where each row is a shifted version of the vector

查看:84
本文介绍了从向量创建矩阵,其中每一行都是向量的移位版本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个像这样的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆