创建具有不同起始值的升序numpy数组

时间:2018-02-09 19:26:30

标签: python arrays numpy

我很抱歉没能说得好,我确定以前曾经问过这个问题,但我不知道该搜索什么(如果你能告诉我,我会很感激的知道如何在downvoting之前改进这个问题)。这就是我想要的:

array_1 = [0,1,2,3,4,5,6]
array_2 = [1,2,3,4,5,6,0]
array_3 = [2,3,4,5,6,0,1]
...
array_7 = [6,0,1,2,3,4,5] 

创建此内容的最快方法是什么?实际的阵列长度约为700左右。

3 个答案:

答案 0 :(得分:3)

使用np.roll执行此操作的一种方法:

for i in range(7):
    print(np.roll(np.arange(7, dtype=np.int), -i))

[0 1 2 3 4 5 6]
[1 2 3 4 5 6 0]
[2 3 4 5 6 0 1]
[3 4 5 6 0 1 2]
[4 5 6 0 1 2 3]
[5 6 0 1 2 3 4]
[6 0 1 2 3 4 5]

答案 1 :(得分:2)

scipy.linalg.circulantnp.flip

一起使用
import scipy
a = np.flip(np.arange(7), 0)
# a: array([6, 5, 4, 3, 2, 1, 0])

b = scipy.linalg.circulant(a)
array([[6, 0, 1, 2, 3, 4, 5],
       [5, 6, 0, 1, 2, 3, 4],
       [4, 5, 6, 0, 1, 2, 3],
       [3, 4, 5, 6, 0, 1, 2],
       [2, 3, 4, 5, 6, 0, 1],
       [1, 2, 3, 4, 5, 6, 0],
       [0, 1, 2, 3, 4, 5, 6]])

b被称为循环矩阵。

如果再次翻转b(返回视图),

np.flip(b, 0)
array([[0, 1, 2, 3, 4, 5, 6],
       [1, 2, 3, 4, 5, 6, 0],
       [2, 3, 4, 5, 6, 0, 1],
       [3, 4, 5, 6, 0, 1, 2],
       [4, 5, 6, 0, 1, 2, 3],
       [5, 6, 0, 1, 2, 3, 4],
       [6, 0, 1, 2, 3, 4, 5]])

构建矩阵的其他方法(归功于Paul Panzer):

linalg.toeplitz(np.arange(7)[::-1], (np.arange(7)-1) % 7)
linalg.hankel(np.arange(7), (np.arange(7)-1)%7)

<强>参考

hankeltoeplitzcirculant

的文档

Toeplitz and Circulant Matrices: A review

感谢@Paul Panzer关于矩阵形状和生成矩阵的各种方法的提醒。

答案 2 :(得分:2)

如果一个视图足够好,那么stride_tricks应该很难被击败,速度方面(你可以将n设置为一百万并且仍然可以获得即时结果):

>>> n = 7
>>> a = np.arange(2*n-1)%n
>>> aa = np.lib.stride_tricks.as_strided(a, (n, n), 2*a.strides)
>>> aa
array([[0, 1, 2, 3, 4, 5, 6],
       [1, 2, 3, 4, 5, 6, 0],
       [2, 3, 4, 5, 6, 0, 1],
       [3, 4, 5, 6, 0, 1, 2],
       [4, 5, 6, 0, 1, 2, 3],
       [5, 6, 0, 1, 2, 3, 4],
       [6, 0, 1, 2, 3, 4, 5]])