1. NumPy에서 도형의 의미
"말 그대로 숫자 목록과 모든 목록에 숫자 만 포함되어있는 목록의 목록이라는 것을 알고 있습니다."라고 생각하면 약간 도움이되지 않습니다.
NumPy와 배열에 대해 생각하는 가장 좋은 방법은 두 부분으로 구성되어 있다는 점이다 데이터 버퍼 단지 원시 요소의 블록 및 인 뷰 데이터 버퍼를 해석하는 방법에 대해 설명합니다.
예를 들어, 12 개의 정수 배열을 만드는 경우 :
>>> a = numpy.arange(12)
>>> a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
그런 다음 a
데이터 버퍼로 구성되며 다음과 같이 정렬됩니다.
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
데이터를 해석하는 방법을 설명하는보기 :
>>> a.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
>>> a.dtype
dtype('int64')
>>> a.itemsize
8
>>> a.strides
(8,)
>>> a.shape
(12,)
여기서 모양 (12,)
은 배열이 0에서 11까지 실행되는 단일 색인으로 색인화됨을 의미합니다. 개념적으로이 단일 색인에 레이블을 지정 i
하면 배열 a
은 다음과 같습니다.
i= 0 1 2 3 4 5 6 7 8 9 10 11
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
우리가하면 바꿀 배열을,이 데이터 버퍼를 변경하지 않습니다. 대신, 데이터를 해석하는 다른 방법을 설명하는 새보기를 작성합니다. 그래서 후 :
>>> b = a.reshape((3, 4))
배열은와 b
동일한 데이터 버퍼를 a
갖지만 이제는 각각 0에서 2, 0에서 3까지 실행 되는 두 개의 인덱스로 인덱스됩니다. 우리는 두 개의 인덱스 라벨 경우 i
와 j
, 배열 b
과 같은 모양을 :
i= 0 0 0 0 1 1 1 1 2 2 2 2
j= 0 1 2 3 0 1 2 3 0 1 2 3
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
의미하는 것은:
>>> b[2,1]
9
두 번째 인덱스가 빠르게 변경되고 첫 번째 인덱스가 느리게 변경되는 것을 볼 수 있습니다. 이것을 다른 방식으로 선호하는 경우 order
매개 변수를 지정할 수 있습니다 .
>>> c = a.reshape((3, 4), order='F')
그러면 다음과 같이 색인이 생성 된 배열이 생성됩니다.
i= 0 1 2 0 1 2 0 1 2 0 1 2
j= 0 0 0 1 1 1 2 2 2 3 3 3
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
의미하는 것은:
>>> c[2,1]
5
이제 배열의 크기가 1 이상인 모양을 갖는 것이 무엇을 의미하는지 분명해야합니다.
>>> d = a.reshape((12, 1))
배열 d
은 두 개의 인덱스로 인덱스되며 첫 번째 인덱스는 0에서 11까지이며 두 번째 인덱스는 항상 0입니다.
i= 0 1 2 3 4 5 6 7 8 9 10 11
j= 0 0 0 0 0 0 0 0 0 0 0 0
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
그래서 :
>>> d[10,0]
10
길이 1의 차원은 "무료"(어떤 의미에서), 그래서 당신이 도시에가는 것을 막을 수있는 것은 없습니다 :
>>> e = a.reshape((1, 2, 1, 6, 1))
다음과 같이 색인이 생성 된 배열을 제공합니다.
i= 0 0 0 0 0 0 0 0 0 0 0 0
j= 0 0 0 0 0 0 1 1 1 1 1 1
k= 0 0 0 0 0 0 0 0 0 0 0 0
l= 0 1 2 3 4 5 0 1 2 3 4 5
m= 0 0 0 0 0 0 0 0 0 0 0 0
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
그래서 :
>>> e[0,1,0,0,0]
6
참고 항목 NumPy와 내부 문서 배열 구현하는 방법에 대한 자세한 내용을.
2. 무엇을해야합니까?
때문에 numpy.reshape
단지 새로운 뷰를 작성, 당신은 필요할 때마다 그것을 사용하는 방법에 대해 두려워해서는 안된다. 배열을 다른 방식으로 인덱싱하려는 경우 사용하는 올바른 도구입니다.
그러나 계산 시간이 길면 일반적으로 처음에 "올바른"모양으로 배열을 구성 할 수 있으므로 모양 변경 및 조옮김 횟수를 최소화 할 수 있습니다. 그러나 실제 상황을 보지 않으면 서 재구성해야 할 필요성이 무엇인지, 변경해야 할 것을 말하기는 어렵습니다.
귀하의 질문에 예는 다음과 같습니다
numpy.dot(M[:,0], numpy.ones((1, R)))
그러나 이것은 현실적이지 않습니다. 먼저,이 표현은 :
M[:,0].sum()
더 간단하게 결과를 계산합니다. 둘째, 실제로 열 0에 특별한 것이 있습니까? 아마도 실제로 필요한 것은 다음과 같습니다.
M.sum(axis=0)