NxN矩阵排列

时间:2016-05-13 22:33:23

标签: python arrays python-3.x numpy permutation

我在Uni为我的python课做了这项功课,我无法理解它。基本上我需要编写一个返回NxN数组的程序(最好在这种情况下使用numpy:

123456
212345
321234
432123
543212
654321

我试图创建一个简单的6x6数组,例如

X = np.full((n,n),np.arange(1,+n+1))

返回

123456
123456
123456
123456
123456
123456

但这些只是用最后一个元素切换最后一个元素的排列和#34;在中间向右推动那些元素,但如前所述,它更复杂。提前谢谢。

5 个答案:

答案 0 :(得分:2)

您能否根据X[i,j]i提出j的公式? (我可以,但这是作业!)

如果是这样,你可以这样做:

is, js = np.indices((n,n))
X = your_formula(is, js)

例如,如果您想要X[i,j] = i + j,则可以执行

is, js = np.indices((n,n))
X = is + js

n=3会给出

012
123
234

答案 1 :(得分:1)

如果你正在编写循环来解决数组问题,那么你通常做错了。只需使用上三角矩阵。

($3==6411 || $3==6311)

答案 2 :(得分:0)

由于这是一个家庭作业,我不会给你完整的答案,但我会给你一个足够的小费,让你去。

当你拥有所有这些数字时,可以考虑将它们放入np.array中,这样你就可以使用np.reshape(verctor,[lines,columns])。这是指向Numpy documentation的链接。

答案 3 :(得分:0)

有几种方法可以做到这一点:

  1. 也许最简单的方法是使用slicingslist comprehensions

    def myfunc(n):
        x = range(1, n+1)
        return np.asarray([x[1:i+1][::-1] + x[:n-i] for i in range(n)])
    
  2. 你也可以使用类似Matlab的函数diagtranspose

    def myfunc(n):
        x = np.diag(np.ones(n))
        for i in range(2, n+1):
            d = np.diag(i*np.ones(n-i+1), i-1)
            x += d + d.T
        return x
    
  3. 基于循环的解决方案 - 正如@ GoBrewers14正确指出的那样 - 但是创建大型数组效率很低。在这种情况下,您应该使用矢量化算法。如果您不希望使用其他答案中建议的SciPy的toeplitzcirculant函数,broadcasting就是您的朋友。

    def myfunc(n):
        x = np.arange(n).reshape((1, n))
        return np.abs(x - x.T) + 1
    
  4. 这就是你通过运行上述任何实现得到的结果:

    >>> myfunc(6)
    array([[1, 2, 3, 4, 5, 6],
           [2, 1, 2, 3, 4, 5],
           [3, 2, 1, 2, 3, 4],
           [4, 3, 2, 1, 2, 3],
           [5, 4, 3, 2, 1, 2],
           [6, 5, 4, 3, 2, 1]])
    

    希望这有帮助

答案 4 :(得分:0)

这可能不是你可以用来做作业的答案,但是......

In [619]: from scipy.linalg import toeplitz

In [620]: toeplitz(range(1, 7))
Out[620]: 
array([[1, 2, 3, 4, 5, 6],
       [2, 1, 2, 3, 4, 5],
       [3, 2, 1, 2, 3, 4],
       [4, 3, 2, 1, 2, 3],
       [5, 4, 3, 2, 1, 2],
       [6, 5, 4, 3, 2, 1]])

有关详细信息,请参阅documentation for scipy.linalg.toeplitz