programing

NumPy의 전치() 방법은 배열의 축을 어떻게 치환합니까?

mailnote 2023. 8. 4. 23:15
반응형

NumPy의 전치() 방법은 배열의 축을 어떻게 치환합니까?

In [28]: arr = np.arange(16).reshape((2, 2, 4))

In [29]: arr
Out[29]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])


In [32]: arr.transpose((1, 0, 2))
Out[32]: 
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])

을 가정튜전플때달할을의수리우에 때.transpose()함수, 무슨 일이 일어납니까?

, 배열입니다: 을 통과할 때 하는 방법입니다. 축의 튜플을 전달할 때 NumPy는 어레이를 어떻게 변환합니까?(1, 0 ,2)이 정수들이 어떤 행이나 열을 가리키는지 설명해 주시겠습니까?그리고 NumPy의 맥락에서 축 번호는 무엇입니까?

배열을 바꾸기 위해 NumPy는 각 축의 모양과 스트라이드 정보를 교환합니다.다음은 발전 사항입니다.

>>> arr.strides
(64, 32, 8)

>>> arr.transpose(1, 0, 2).strides
(32, 64, 8)

전치 연산은 축 0 및 축 1의 보폭을 바꿉니다.이 축들의 길이 또한 스왑되었습니다 (두 길이 모두2이 예에서는).

이렇게 하려면 데이터를 복사할 필요가 없습니다. NumPy는 기본 메모리를 보는 방식을 변경하여 새 어레이를 구성할 수 있습니다.


단계별 시각화

스트라이드 값은 배열 축의 다음 값에 도달하기 위해 메모리에서 이동해야 하는 바이트 수를 나타냅니다.

이제, 우리의 3D 어레이는arr다음과 같이 표시됩니다(표시된 축 포함).

enter image description here

이 배열은 연속된 메모리 블록에 저장됩니다. 기본적으로 1차원입니다.3D 개체로 해석하려면 NumPy가 다음 세 개의 축 중 하나를 따라 이동하려면 일정한 바이트 수를 뛰어넘어야 합니다.

enter image description here

각 정수는 8바이트의 메모리를 차지하므로(int64dtype을 사용) 각 차원의 스트라이드 값은 점프해야 하는 값의 8배입니다.예를 들어 축 1을 따라 이동하려면 4개의 값(32바이트)이 점프되고 축 0을 따라 이동하려면 8개의 값(64바이트)이 점프되어야 합니다.

가 리가글 쓸때을우를 쓸 때.arr.transpose(1, 0, 2)우리는 축 0과 1을 교환하고 있습니다.전치 배열은 다음과 같습니다.

enter image description here

NumPy가 해야 할 일은 축 0 및 축 1(축 2는 변경되지 않음)에 대한 스트라이드 정보를 스왑하는 것입니다.이제 축 0보다 축 1을 따라 이동하려면 더 멀리 점프해야 합니다.

enter image description here

이 기본 개념은 배열 축의 모든 순열에 적용됩니다.전치를 처리하는 실제 코드는 C로 작성되어 있으며 여기에서 확인할 수 있습니다.

설명서에 설명된 대로:

기본적으로 치수를 반대로 하고, 그렇지 않으면 주어진 값에 따라 축을 순열합니다.

인 매개 변수인 " 적선매변를전수있다니습할"를 할 수 .axes차원의 새로운 순서를 정의합니다.

예를 들어 RGB VGA 픽셀 배열의 처음 두 차원을 전환합니다.

 >>> x = np.ones((480, 640, 3))
 >>> np.transpose(x, (1, 0, 2)).shape
 (640, 480, 3)

C 표기법에서 배열은 다음과 같습니다.

int arr[2][2][4]

이것은 22D 배열을 가진 3D 배열입니다.각 2D 어레이에는 21D 어레이가 있고 각 1D 어레이에는 4개의 요소가 있습니다.

그래서 여러분은 3차원을 가지고 있습니다.축은 0, 1, 2이고 크기는 2, 2, 4입니다.이것이 바로 N차원 배열의 축을 다루는 방법입니다.

그렇게,arr.transpose((1, 0, 2))는 축 0에, 축 위치에, 축 2를 2축 1을 0, 을 0사 0, 축 2를 2에 2니 2다에 .축을 효과적으로 순화하고 있습니다.

0 -\/-> 0
1 -/\-> 1
2 ----> 2

다른말하면로,하면,1 -> 0, 0 -> 1, 2 -> 2대상 축은 항상 순서대로 지정되므로 원본 축만 지정하면 됩니다.: 튜을순로읽습니다대서플:▁read다니.(1, 0, 2).

새 "" "" ""입니다.[2][2][4]축 0과 1의 크기(2)가 동일하기 때문입니다.

더 흥미로운 것은 에 의한 전치입니다.(2, 1, 0)그것은 당신에게 배열을 제공합니다.[4][2][2].

0 -\ /--> 0
1 --X---> 1
2 -/ \--> 2

다른말하면로,하면,2 -> 0, 1 -> 1, 0 -> 2: 튜을순로읽습니다대서플:▁read다니.(2, 1, 0).

>>> arr.transpose((2,1,0))
array([[[ 0,  8],
        [ 4, 12]],

       [[ 1,  9],
        [ 5, 13]],

       [[ 2, 10],
        [ 6, 14]],

       [[ 3, 11],
        [ 7, 15]]])

당신은 결국.int[4][2][2].

모든 차원의 크기가 다르다면 각 축이 어디로 갔는지 알 수 있을 것입니다.

왜 첫 번째 내부 요소는[0, 8]3D 배열을 두 장의 종이로 시각화하면,0그리고.8왼쪽 상단에 하나씩, 다른 하나는 다른 하나에 줄을 서 있습니다.를 으로써.(2, 1, 0)당신은 종이에서 종이로 가는 방향이 왼쪽에서 오른쪽으로 가고, 왼쪽에서 오른쪽으로 가는 방향이 지금 종이에서 종이로 가는 것을 원한다고 말하는 것입니다.왼쪽에서 오른쪽으로 4개의 요소가 있어서, 대신에 4개의 종이가 있습니다.그리고 두 개의 종이가 있었습니다. 그래서 이제 왼쪽에서 오른쪽으로 가는 두 개의 요소가 있습니다.

ASCII 아트가 형편없어서 죄송합니다.¯\_(ツ)_/¯

질문과 예제는 Wes McKinney의 Python for Data Analysis라는 에서 유래한 것으로 보입니다.의 이 기능transpose 4.1장에 언급되어 있습니다. 배열을 전환하고 축을 교환합니다.

배열의 고원어의경우이transpose추가적인 마인드 벤딩을 위해 축을 영구화하기 위해 축 번호의 튜플을 허용합니다.

여기서 "permute"는 "재배치"를 의미하므로 축의 순서를 다시 정렬합니다.

의자에 있는 .transpose(1, 0, 2)원본과 비교하여 축의 순서가 변경되는 방법을 결정합니다.을 사용하여.transpose(1, 0, 2)우리는 "첫 번째 축을 두 번째 축으로 변경"을 의미합니다.사용할 경우.transpose(0, 1, 2)변경할 내용이 없으므로 배열이 동일하게 유지됩니다. 기본 순서입니다.

책에 있는 예는 다음과 같습니다.(2, 2, 4)크기 배열은 첫 번째 축과 두 번째 축의 크기가 동일하기 때문에 명확하지 않습니다.는 행 정하는 것 에는 바뀌지 것 .arr[0, 1]그리고.arr[1, 0].

각 차원의 크기가 다른 3차원 배열로 다른 예제를 시도하면 재배열 부분이 더 명확해집니다.

In [2]: x = np.arange(24).reshape(2, 3, 4)

In [3]: x
Out[3]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

In [4]: x.transpose(1, 0, 2)
Out[4]: 
array([[[ 0,  1,  2,  3],
        [12, 13, 14, 15]],

       [[ 4,  5,  6,  7],
        [16, 17, 18, 19]],

       [[ 8,  9, 10, 11],
        [20, 21, 22, 23]]])

는 여서기, 원배크기입니다.(2, 3, 4)와 두 저가희 1, 2번을바가 됩니다.(3, 2, 4)크기로어떻게 재배열이 정확히 이루어졌는지 자세히 살펴보면, 숫자 배열이 특정 패턴으로 바뀐 것 같습니다.@RobertB의 종이 비유를 사용하여, 만약 우리가 두 개의 숫자 덩어리를 가지고 각각을 시트에 쓴 다음, 각 시트에서 한 줄씩 배열의 1차원을 구성한다면, 우리는 이제 가장 바깥쪽에서 가장 안쪽 레이어까지 세는 3x2x4 크기의 배열을 갖게 될 것입니다.

[ 0,  1,  2,  3] \ [12, 13, 14, 15]

[ 4,  5,  6,  7] \ [16, 17, 18, 19]

[ 8,  9, 10, 11] \ [20, 21, 22, 23]

다양한 크기의 어레이를 사용하여 게임을 하고, 다양한 축을 변경하여 작동 방식에 대한 직관력을 높이는 것이 좋습니다.

Wes McKinney의 데이터 분석을 위한 Python에서도 를 발견했습니다.

3차원 해결 , 3차원 텐서에 인 접근 하겠습니다.n-차원 텐서.

간단한 3차원 텐서 예제

(2,2,4)-텐서가 있다고 가정합니다.

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

 [[ 8  9 10 11]
  [12 13 14 15]]]

각 점의 좌표를 살펴보면 다음과 같습니다.

[[[ (0,0,0)  (0,0,1)  (0,0,2)  (0,0,3)]
  [ (0,1,0)  (0,1,1)  (0,1,2)  (0,1,3)]]

 [[ (1,0,0)  (1,0,1) (1,0,2) (0,0,3)]
  [ (1,1,0)  (1,1,1) (1,1,2) (0,1,3)]]

이 이제위배열이라고 .example_array과 같은 작업을 .example_array.transpose(1,2,0)

(1,2,0)-변환을 다음과 . (이은 " 이동에 해당합니다.: ▁-(▁to▁aation다섞습▁this해니left당-함:inates▁as▁"▁we▁thatnote▁the,▁coord-▁shuffletransform"▁follows▁(▁particationular▁transform)

(0,0,0)  ->  (0,0,0)
(0,0,1)  ->  (0,1,0)
(0,0,2)  ->  (0,2,0)
(0,0,3)  ->  (0,3,0)
(0,1,0)  ->  (1,0,0)
(0,1,1)  ->  (1,1,0)
(0,1,2)  ->  (1,2,0)
(0,1,3)  ->  (1,3,0)
(1,0,0)  ->  (0,0,1)
(1,0,1)  ->  (0,1,1)
(1,0,2)  ->  (0,2,1)
(0,0,3)  ->  (0,3,0)
(1,1,0)  ->  (1,0,1)
(1,1,1)  ->  (1,1,1)
(1,1,2)  ->  (1,2,1)
(0,1,3)  ->  (1,3,0)

이제 각 원래 값에 대해 결과 행렬의 이동된 좌표에 배치합니다.

를 들어,값 를들 어값, 은예가 .10가 좌표 있음입니다.(1, 0, 2)원래 행렬에서 그리고 좌표를 가질 것입니다.(0, 2, 1)결과 행렬에서.첫 번째 2d 텐서 서브매트릭스의 세 번째 행, 두 번째 행에 배치됩니다.

따라서 결과 행렬은 다음과 같습니다.

array([[[ 0,  8],
        [ 1,  9],
        [ 2, 10],
        [ 3, 11]],

       [[ 4, 12],
        [ 5, 13],
        [ 6, 14],
        [ 7, 15]]])

일반 n차원 텐서 접근법

위해서n-차원 텐서, 알고리즘은 동일합니다.원래 행렬에서 단일 값의 모든 좌표를 고려합니다.해당 개별 좌표의 축을 섞습니다.값을 결과 행렬의 혼합된 결과 좌표에 놓습니다.나머지 모든 값에 대해 위 과정을 반복합니다.

a. transpose()[i,j,k] = a[k,j,i]요약하면

a = np.array( range(24), int).reshape((2,3,4))
a.shape gives (2,3,4)
a.transpose().shape gives (4,3,2)  shape tuple is reversed.

is tuple 파라미터가 전달되면 tuple에 따라 축이 순열됩니다.예를들면

a = np.array(범위(24), int).모양 변경((2,3,4)

a[i,j,k]는 a.copose((2,0,1)와 같습니다[k,i,j]

축 0이 2위를 차지합니다.

축 1이 3위를 차지합니다.

축 2 이야기 1위

물론 전치로 전달된 튜플 매개 변수의 값이 고유하고 범위(축 수)에 있는지 주의해야 합니다.

언급URL : https://stackoverflow.com/questions/32034237/how-does-numpys-transpose-method-permute-the-axes-of-an-array

반응형