2014-10-07 2 views
2

몇 가지 질문이 있지만 가까운 답변을 찾지 못했습니다. 내가 주어진 축을 따라 numpy 3D 배열의 적절한 정렬을하려고합니다. 간단한 정렬을 원하지 않지만, 내 자신의 인덱스에 따라 배열을 사용하고 싶습니다. 예를 들어적절한 인덱스로 정렬 numpy 배열

a = np.random.rand((3,3,3)) 

와의 내가 이전 배열의 다음 인덱스에 따라 마지막 차원을 의지하고 싶은 말은하자

new_order = [1,2,0] 

내가 말할 수 있기를 기대합니다 :

a[:,:,new_order] = a 

그러나 예상대로 작동하지 않습니다. 제안?

다음
+2

'a = a [:, :, new_order]'를 찾으십니까? – farenorth

+0

Matlab에서 그렇게 할 수 있었던 것은 오랫동안 잊혀졌습니다. – farenorth

답변

4

np.ndarray.sort은 내부에 있다고 주장하는 유일한 정렬이며 많은 제어 권한을 부여하지 않습니다.

오른쪽에 주문 색인을 삽입하면 작동하지만 예측할 수없는 결과가 발생할 수 있습니다. 분명히 일종의 순차적 할당을하고 있으며, 왼쪽에있는 이전 과제는 오른쪽의 값에 영향을 미칠 수 있습니다.

In [719]: a=np.arange(12).reshape(3,4) 
In [720]: a[:,[0,1,3,2]]=a 
In [721]: a 
Out[721]: 
array([[ 0, 1, 2, 2], 
     [ 4, 5, 6, 6], 
     [ 8, 9, 10, 10]]) 

이런 종류의 할당을하려면 일종의 버퍼링이 필요합니다.

In [728]: a[:,[0,1,3,2]]=a.copy() 
In [729]: a 
Out[729]: 
array([[ 0, 1, 3, 2], 
     [ 4, 5, 7, 6], 
     [ 8, 9, 11, 10]]) 

오른쪽의 색인 생성은이 문제를 해결하지만 현재 위치에서 수행되지는 않습니다. 변수 a은 새 개체를 가리 킵니다.

In [731]: a=a[:,[0,1,3,2]] 
In [732]: a 
Out[732]: 
array([[ 0, 1, 3, 2], 
     [ 4, 5, 7, 6], 
     [ 8, 9, 11, 10]]) 

그러나 [:]와 할당 이것을 해결할 수

In [738]: a=np.arange(12).reshape(3,4) 
In [739]: a.__array_interface__ 
Out[739]: 
{'data': (181868592, False), # 181... is the id of the data buffer 
'descr': [('', '<i4')], 
'shape': (3, 4), 
'strides': None, 
'typestr': '<i4', 
'version': 3} 
In [740]: a[:]=a[:,[0,1,3,2]] 
In [741]: a.__array_interface__ 
Out[741]: 
{'data': (181868592, False), # same data buffer 
'descr': [('', '<i4')], 
'shape': (3, 4), 
'strides': None, 
'typestr': '<i4', 
'version': 3} 
In [742]: a 
Out[742]: 
array([[ 0, 1, 3, 2], 
     [ 4, 5, 7, 6], 
     [ 8, 9, 11, 10]]) 

a.data ID가 동일하다는 사실은 이것이 올바른 위치 동작임을 나타낸다. 그러나 다른 인덱싱으로 테스트하여 원하는대로 작동하는지 확인하는 것이 좋습니다.

하지만 'inplace'정렬이 필요합니까? 배열이 매우 큰 경우 메모리 오류를 피할 필요가 있습니다. 그러나 우리는 대안이 작동하는지 테스트해야합니다.

inplace도 동일한 데이터를 사용하는 다른 변수가있는 경우 중요합니다. a[:]= 예는

b = a.T # a transpose 

들어 b의 행이 재 배열된다. ab은 계속해서 data을 공유합니다. a=의 경우 b은 변경되지 않습니다. ab은 이제 분리됩니다.