NumPy의 transpose () 메서드는 배열의 축을 어떻게 변경합니까?
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()
함수에 전달하면 어떻게됩니까?
구체적으로 말하자면, 이것은 3D 배열입니다. 축의 튜플을 전달할 때 NumPy는 배열을 어떻게 변환 (1, 0 ,2)
합니까? 이 정수가 참조하는 행 또는 열을 설명 할 수 있습니까? 그리고 NumPy의 맥락에서 축 번호는 무엇입니까?
배열을 전치하기 위해 NumPy는 각 축의 모양과 보폭 정보를 바꿉니다. 다음은 걸음 걸이입니다.
>>> arr.strides
(64, 32, 8)
>>> arr.transpose(1, 0, 2).strides
(32, 64, 8)
조바꿈 작업은 축 0과 축 1의 보폭을 바꿨습니다.이 축의 길이도 바뀝니다 (두 길이 모두이 2
예에 있음).
이를 위해 데이터를 복사 할 필요가 없습니다. NumPy는 새 배열을 구성하기 위해 기본 메모리를 보는 방식을 간단히 변경할 수 있습니다.
보폭 시각화
stride 값은 배열 축의 다음 값에 도달하기 위해 메모리에서 이동해야하는 바이트 수를 나타냅니다.
이제 3D 배열 arr
은 다음과 같습니다 (레이블이 지정된 축 포함).
이 배열은 연속 된 메모리 블록에 저장됩니다 . 본질적으로 1 차원입니다. 3D 객체로 해석하려면 NumPy가 세 축 중 하나를 따라 이동하기 위해 일정한 수의 바이트 위로 점프해야합니다.
각 정수는 8 바이트의 메모리를 차지하므로 (int64 dtype 사용) 각 차원의 stride 값은 점프해야하는 값 수의 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]
which is an 3D array having 2 2D arrays. Each of those 2D arrays has 2 1D array, each of those 1D arrays has 4 elements.
So you have three dimensions. The axes are 0, 1, 2, with sizes 2, 2, 4. This is exactly how numpy treats the axes of an N-dimensional array.
So, arr.transpose((1, 0, 2))
would take axis 1 and put it in position 0, axis 0 and put it in position 1, and axis 2 and leave it in position 2. You are effectively permuting the axes:
0 -\/-> 0
1 -/\-> 1
2 ----> 2
In other words, 1 -> 0, 0 -> 1, 2 -> 2
. The destination axes are always in order, so all you need is to specify the source axes. Read off the tuple in that order: (1, 0, 2)
.
In this case your new array dimensions are again [2][2][4]
, only because axes 0 and 1 had the same size (2).
More interesting is a transpose by (2, 1, 0)
which gives you an array of [4][2][2]
.
0 -\ /--> 0
1 --X---> 1
2 -/ \--> 2
In other words, 2 -> 0, 1 -> 1, 0 -> 2
. Read off the tuple in that order: (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]]])
You ended up with an int[4][2][2]
.
You'll probably get better understanding if all dimensions were of different size, so you could see where each axis went.
Why is the first inner element [0, 8]
? Because if you visualize your 3D array as two sheets of paper, 0
and 8
are lined up, one on one paper and one on the other paper, both in the upper left. By transposing (2, 1, 0)
you're saying that you want the direction of paper-to-paper to now march along the paper from left to right, and the direction of left to right to now go from paper to paper. You had 4 elements going from left to right, so now you have four pieces of paper instead. And you had 2 papers, so now you have 2 elements going from left to right.
끔찍한 ASCII 아트에 대해 죄송합니다. ¯\_(ツ)_/¯
요약하면 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.
튜플 매개 변수가 전달되면 축은 튜플에 따라 순열됩니다. 예를 들면
a = np.array (range (24), int) .reshape ((2,3,4))
a [i, j, k]는 a.transpose ((2,0,1)) [k, i, j]와 같습니다.
축 0이 2 위를 차지함
축 1이 3 위를 차지함
축 2 이야기 1 위
물론 전치하기 위해 전달 된 튜플 매개 변수의 값이 고유하고 범위 (축 수) 내에 있는지주의해야합니다.
'IT Share you' 카테고리의 다른 글
Twitter Bootstrap 열이 올바르게 정렬되지 않음 (0) | 2021.01.06 |
---|---|
dyld : 라이브러리가로드되지 않음 : @rpath with iOS8 (0) | 2021.01.06 |
STL 벡터 저장소가 항상 연속적이라고 가정하는 것이 안전합니까? (0) | 2021.01.06 |
자동 쿠키 처리 C # /. NET HttpWebRequest + HttpWebResponse (0) | 2021.01.06 |
Visual Studio 빌드 전 이벤트 명령 줄에서 파일을 삭제하는 방법 (0) | 2021.01.06 |