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
다음과 같이 표시됩니다(표시된 축 포함).
이 배열은 연속된 메모리 블록에 저장됩니다. 기본적으로 1차원입니다.3D 개체로 해석하려면 NumPy가 다음 세 개의 축 중 하나를 따라 이동하려면 일정한 바이트 수를 뛰어넘어야 합니다.
각 정수는 8바이트의 메모리를 차지하므로(int64dtype을 사용) 각 차원의 스트라이드 값은 점프해야 하는 값의 8배입니다.예를 들어 축 1을 따라 이동하려면 4개의 값(32바이트)이 점프되고 축 0을 따라 이동하려면 8개의 값(64바이트)이 점프되어야 합니다.
가 리가글 쓸때을우를 쓸 때.arr.transpose(1, 0, 2)
우리는 축 0과 1을 교환하고 있습니다.전치 배열은 다음과 같습니다.
NumPy가 해야 할 일은 축 0 및 축 1(축 2는 변경되지 않음)에 대한 스트라이드 정보를 스왑하는 것입니다.이제 축 0보다 축 1을 따라 이동하려면 더 멀리 점프해야 합니다.
이 기본 개념은 배열 축의 모든 순열에 적용됩니다.전치를 처리하는 실제 코드는 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
'programing' 카테고리의 다른 글
Android - 텍스트에 그림자? (0) | 2023.08.04 |
---|---|
Oracle에서 IFELL 사용 (0) | 2023.08.04 |
스프링 스케줄링: @스케줄링 대 쿼츠 (0) | 2023.08.04 |
타자 스크립트를 사용하여 각도 2에서 장치 디스플레이의 높이와 너비를 얻는 방법은 무엇입니까? (0) | 2023.08.04 |
깃 클론:stdout으로 stderr 리디렉션하지만 오류는 stderr에 계속 기록됩니다. (0) | 2023.08.04 |