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
의 행이 재 배열된다. a
및 b
은 계속해서 data
을 공유합니다. a=
의 경우 b
은 변경되지 않습니다. a
및 b
은 이제 분리됩니다.
'a = a [:, :, new_order]'를 찾으십니까? – farenorth
Matlab에서 그렇게 할 수 있었던 것은 오랫동안 잊혀졌습니다. – farenorth