복붙노트

[PYTHON] numpy 2D 배열의 열 재정렬

PYTHON

numpy 2D 배열의 열 재정렬

numpy 2D 배열의 열 순서를 새로운 임의의 순서로 변경하는 방법이 있습니까? 예를 들어 배열이 있습니다.

array([[10, 20, 30, 40, 50],
       [ 6,  7,  8,  9, 10]])

나는 그것을 바꾸고 싶다.

array([[10, 30, 50, 40, 20],
       [ 6,  8, 10,  9,  7]])

순열을 적용함으로써

0 -> 0
1 -> 4
2 -> 1
3 -> 3
4 -> 2

기둥에. 따라서 새 행렬에서 원본의 첫 ​​번째 열을 제자리에두고 두 번째 열은 마지막 열로 이동해야합니다.

거기에 numpy 기능이 있나요? 나는 상당히 큰 행렬을 가지고 있으며, 더 큰 행렬을 얻을 것으로 기대한다. 그래서 나는 가능한 한 빨리 (그리고 순열 행렬이없는)

고맙습니다.

해결법

  1. ==============================

    1.멋진 색인 생성을 사용하여 가능합니다.

    멋진 색인 생성을 사용하여 가능합니다.

    >>> import numpy as np
    >>> a = np.array([[10, 20, 30, 40, 50],
    ...               [ 6,  7,  8,  9, 10]])
    >>> your_permutation = [0,4,1,3,2]
    >>> i = np.argsort(your_permutation)
    >>> i
    array([0, 2, 4, 3, 1])
    >>> a[:,i]
    array([[10, 30, 50, 40, 20],
           [ 6,  8, 10,  9,  7]])
    

    이 사본은보기가 아니라 사본입니다. 일반적인 경우에는 메모리에서 numpy 배열이 스트라이드 (strided)되기 때문에 내부 치환이 불가능합니다.

  2. ==============================

    2.나는 원래 행렬에 순열 행렬을 곱하는 것에 의해 이것을위한 행렬 기반 해법을 가지고있다. 이렇게하면 원본 행렬의 요소 위치가 변경됩니다.

    나는 원래 행렬에 순열 행렬을 곱하는 것에 의해 이것을위한 행렬 기반 해법을 가지고있다. 이렇게하면 원본 행렬의 요소 위치가 변경됩니다.

    import numpy as np
    
    a = np.array([[10, 20, 30, 40, 50],
           [ 6,  7,  8,  9, 10]])
    
    # Create the permutation matrix by placing 1 at each row with the column to replace with
    your_permutation = [0,4,1,3,2]
    
    perm_mat = np.zeros((len(your_permutation), len(your_permutation)))
    
    for idx, i in enumerate(your_permutation):
        perm_mat[idx, i] = 1
    
    print np.dot(a, perm_mat)
    
  3. from https://stackoverflow.com/questions/20265229/rearrange-columns-of-numpy-2d-array by cc-by-sa and MIT license