NumPy 배열 전치


193

Python과 NumPy를 사용하고 "transpose"에 몇 가지 문제가 있습니다.

import numpy as np
a = np.array([5,4])
print(a)
print(a.T)

호출 a.T은 배열을 바꾸지 않습니다. 경우 a, 예를 들면 [[],[]]다음 올바르게 이항,하지만 난의 전치이 필요합니다 [...,...,...].


또한 동일하지만 성공하지 않고,하지 전치 ...입니다 "인쇄 a.transpose"시도
thaking

답변:


247

예상대로 정확하게 작동합니다. 1D 배열 의 조옮김 은 여전히 1D 배열입니다! matlab에 익숙한 경우 기본적으로 1D 배열 개념이 없습니다. Matlab의 "1D"배열은 2D입니다.

1D 벡터를 2D 배열로 변환 한 다음 전치하려면 벡터를 슬라이스하십시오 np.newaxis(또는 None동일하며 newaxis더 읽기 쉽습니다).

import numpy as np
a = np.array([5,4])[np.newaxis]
print(a)
print(a.T)

그러나 일반적으로 이것에 대해 걱정할 필요가 없습니다. 습관을 들이지 않고 추가 차원을 추가하는 것은 일반적으로 원하는 것이 아닙니다. Numpy는 다양한 계산을 수행 할 때 1D 배열을 자동으로 브로드 캐스트합니다. 행 벡터 및 열 벡터를 구별 할 필요는 일반적으로 없다 (어느 것도 없습니다 벡터 . 그들은 모두 2D이야!) 당신은 그냥 벡터를 할 때.


2
@thaking-방금 np.arange1D 배열을 빠르게 만들었습니다. 에 대해 정확히 동일하게 작동합니다 a = np.array([5,4]).
Joe Kington

2
@thaking numpy를 처음 사용하는 경우 둥근 괄호 ()는 numpy의 추가 치수를 나타내지 않습니다. 경우 a = np.arange(10)다음 a되는 array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])등 생산 a.__repr__(). a.ndim --> 1대괄호로 표시되는 1 차원 (즉 ) 벡터 []입니다. 은 array( ... )당신이 중 하나를 수행 할 때 볼 수 없습니다 print(a)a.__str__().
dtlussier

7
@JoeKington은 1D 어레이의 방송이 유용한 상황이 있습니다. 배열의 모든 1D 점 사이의 거리를 계산합니다. 귀하의 솔루션 덕분에 거리 매트릭스를 제공하는 x-x [np.newaxis] .T를 수행 할 수 있습니다
JuanPi

4
개인적으로 np.vstack()작업이 더 명시 적으로 보입니다 print np.vstack(a).
Alexander Pozdneev

2
그것은 matlab 일뿐 만 아니라 선형 대수학은 행 / 열 벡터의 개념을 가지고 있습니다. Numpy는 matlab뿐만 아니라 많은 곳에서 온 사람들에게 특이합니다.
eric dec

135

하나 대신 두 개의 괄호 쌍을 사용하십시오. 이렇게하면 하나의 대괄호 쌍을 사용하는 경우 생성 한 1D 배열과 달리 2D 배열이 바뀔 수 있습니다.

import numpy as np    
a = np.array([[5, 4]])
a.T

보다 철저한 예 :

>>> a = [3,6,9]
>>> b = np.array(a)
>>> b.T
array([3, 6, 9])         #Here it didn't transpose because 'a' is 1 dimensional
>>> b = np.array([a])
>>> b.T
array([[3],              #Here it did transpose because a is 2 dimensional
       [6],
       [9]])

numpy의 shape방법을 사용 하여 여기에서 무슨 일이 일어나고 있는지 확인하십시오.

>>> b = np.array([10,20,30])
>>> b.shape
(3,)
>>> b = np.array([[10,20,30]])
>>> b.shape
(1, 3)

11
이 솔루션을 [np.newaxis] 솔루션보다 선호합니다. 더 우아하게 보입니다.
PhilMacKay

기계는 그렇게 똑똑하지 않습니다. 아내가 한 명이라도 첫 번째 아내로 선언해야합니다.
Sreeragh AR

이것은 정답입니다
bruno

79

1D 배열의 경우 :

a = np.array([1, 2, 3, 4])
a = a.reshape((-1, 1)) # <--- THIS IS IT

print a
array([[1],
       [2],
       [3],
       [4]])

여기서 -1이 "필요한만큼 많은 행"을 의미한다는 것을 이해하면 이것이 배열을 "전치"하는 가장 읽기 쉬운 방법이라는 것을 알았습니다. 배열의 차원이 더 높은 경우을 사용하십시오 a.T.


5
이것은 벡터에서만 작동합니다. 만약 2 차원 어레이를 동작이있는 경우 transposereshape다른 방법으로 배열을 수정 (생성 화상 형상은 동일하지만, 소자는 다르게 배치된다).
johndodo

2
귀하의 의견에 감사드립니다. 나는 당신의 요점을 알지만, @thaking 프레임이라는 정확한 질문에 대한 간단한 한 줄 해결책을 제공하기 때문에 대답을 지우는 것보다 더 혼란스럽게 생각합니다. 약 2 차원 배열이 아니라 1 차원 배열입니다. 여기 사과와 배.
Ulf Aslak

2
물론이야. 귀하의 답변은이 경우에 정확하고 우아합니다. 나는 그것을 비난하지 않았습니다. 그러나 질문 제목 ( "NumPy 어레이 전치")을 감안할 때 많은 방문자가보다 일반적인 솔루션을 찾고 여기에 올 것 같으며 2D 어레이에는 해당되지 않는다고 경고하고 싶었습니다. 그렇지 않으면 OP의 질문에 따라 귀하의 답변이 정확하고 적합합니다.
johndodo

@ UlfAslak, ND 배열에 대한 접근 방식을 일반화 할 수 없다는 답변을 업데이트하십시오! & 라이너가 아닙니다.!
Anu

18

여분의 대괄호 세트로 래핑하여 기존 벡터를 행렬로 변환 할 수 있습니다.

from numpy import *
v=array([5,4]) ## create a numpy vector
array([v]).T ## transpose a vector into a matrix

numpy에는 matrix클래스가 있습니다 ( 배열 대 행렬 참조 ) ...

matrix(v).T ## transpose a vector into a matrix

14

numpy 1D 배열-> 열 / 행 행렬 :

>>> a=np.array([1,2,4])
>>> a[:, None]    # col
array([[1],
       [2],
       [4]])
>>> a[None, :]    # row, or faster `a[None]`
array([[1, 2, 4]])

@ joe-kington이 말했듯 이 가독성 Nonenp.newaxis위해 대체 할 수 있습니다 .


10

1d 배열을 2d 열로 '전치'하려면 다음을 사용할 수 있습니다 numpy.vstack.

>>> numpy.vstack(numpy.array([1,2,3]))
array([[1],
       [2],
       [3]])

또한 바닐라 목록에서도 작동합니다.

>>> numpy.vstack([1,2,3])
array([[1],
       [2],
       [3]])

1
@ sandroscodelller, 기본 코드를 보셨습니까 vstack? np.concatenate([atleast_2d(_m) for _m in tup], 0). 그것은 배열을 (1,1) 배열로 나누고 그것들을 연결합니다! 이 과정에서 복사본이 만들어지고 모든 모양이 바뀌는 것이 보입니다.
hpaulj

3

2D 배열 만 조옮김 할 수 있습니다. numpy.matrix2D 배열을 만드는 데 사용할 수 있습니다 . 이것은 3 년 늦었지만 가능한 해결책 세트에 추가하고 있습니다.

import numpy as np
m = np.matrix([2, 3])
m.T

사용은 np.matrix필요하지 않으며 일반적으로 사용하지 않는 것이 좋습니다.
hpaulj



2

또 다른 해결책 .... :-)

import numpy as np

a = [1,2,4]

[1, 2, 4]

b = np.array([a]).T

배열 ([[1], [2], [4]])


이 솔루션의 문제점은 무엇입니까?!
omotto

1

위의 게시물을 통합하고 있습니다. 다른 사람들이 시간을 절약하는 데 도움이되기를 바랍니다.

아래 배열에는 (2, )차원이 있으며 1 차원 배열입니다.

b_new = np.array([2j, 3j])  

1D 배열을 바꾸는 방법에는 두 가지가 있습니다.


"np.newaxis"로 슬라이스하거나 없음

print(b_new[np.newaxis].T.shape)
print(b_new[None].T.shape)

다른 작문 방법, 위의 T작업 없이 !

print(b_new[:, np.newaxis].shape)
print(b_new[:, None].shape)

[]를 감싸거나 np.matrix를 사용하면 새로운 차원을 추가 할 수 있습니다.!

print(np.array([b_new]).T.shape)
print(np.matrix(b_new).T.shape)

0

위에서 언급 한 의견 중 일부와 같이 1D 배열의 조옮김은 1D 배열이므로 1D 배열을 조옮김하는 한 가지 방법은 배열을 행렬로 변환하는 것입니다.

np.transpose(a.reshape(len(a), 1))


0

에있어서, 상기의 답변에 설명하지만, 설명되지 않은이 문서 위한 numpy.ndarray.transpose방법은 :

1 차원 배열의 경우, 조옮김 벡터는 단순히 동일한 벡터이므로 효과가 없습니다. 1 차원 배열을 2 차원 열 벡터로 변환하려면 추가 차원을 추가해야합니다. np.atleast2d (a) .T는 a [:, np.newaxis]와 같이 이것을 달성합니다.

할 수있는 일 :

import numpy as np
a = np.array([5,4])
print(a)
print(np.atleast_2d(a).T)

사용하는 것보다 어떤 (imo)가 더 낫습니다 newaxis.


0

기본적으로 조옮김 함수는 배열의 모양과 보폭을 바꾸는 것입니다.

>>> a = np.ones((1,2,3))

>>> a.shape
(1, 2, 3)

>>> a.T.shape
(3, 2, 1)

>>> a.strides
(48, 24, 8)

>>> a.T.strides
(8, 24, 48)

1D numpy array (rank-1 array)의 경우 모양과 보폭은 1 요소 튜플이며 바꿀 수 없으며 이러한 1D 배열의 조옮김은 변경되지 않은 상태로 반환합니다. 대신, "행-벡터"(숫자 배열의 배열 (1, n))를 "열-벡터"(숫자 배열의 배열)로 바꿀 수 있습니다 (n, 1). 이를 위해서는 먼저 1D numpy 배열을 행 벡터로 변환 한 다음 모양과 보폭을 바꾸어야합니다 (조옮김). 다음은이를 수행하는 기능입니다.

from numpy.lib.stride_tricks import as_strided

def transpose(a):
    a = np.atleast_2d(a)
    return as_strided(a, shape=a.shape[::-1], strides=a.strides[::-1])

예:

>>> a = np.arange(3)
>>> a
array([0, 1, 2])

>>> transpose(a)
array([[0],
       [1],
       [2]])

>>> a = np.arange(1, 7).reshape(2,3)
>>> a     
array([[1, 2, 3],
       [4, 5, 6]])

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

물론 1D 배열을 가지고 있기 때문에 이런 식으로 할 필요가 없으며 또는 로 (n, 1)배열을 직접 배열 로 바꿀 수 있습니다 . 방금 전치 배열이 어떻게 작동하는지 보여주고 싶었습니다.a.reshape((-1, 1))a[:, None]


0

지금까지 1D 배열에 대해 작고 읽기 쉬운 방식으로 구현하는 방법을 배웠습니다.

h = np.array([1,2,3,4,5])

v1 = np.vstack(h)
v2 = np.c_[h]

h1 = np.hstack(v1)
h2 = np.r_[v2[:,0]]

numpy.r_ numpy.c_ 는 슬라이스 객체를 각각 첫 번째 축과 두 번째 축을 따라 연결 하도록 변환합니다. 따라서 수직 배열 v2를 수평 배열 h2로 다시 변환 할 때 슬라이싱 v2 [:, 0]

numpy.vstack 은 (N,) 모양의 1 차원 배열이 (1, N)으로 재구성 된 후 첫 번째 축을 따라 연결하는 것과 같습니다. vsplit 으로 나눈 배열을 다시 작성합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.