我很抱歉没能说得好,我确定以前曾经问过这个问题,但我不知道该搜索什么(如果你能告诉我,我会很感激的知道如何在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左右。
答案 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.circulant
与np.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)
<强>参考强>
的文档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]])