2014-09-23 5 views
1
Tool = [[0 for x in xrange(3)] for y in xrange(len(xTool)-1)] 
for l in xrange((len(xTool) - 1)): 
    Tool[l][0] = yTool[l]; Tool[l][1] = xTool[l]; Tool[l][2] = zTool[l] 

모든 포인트의 x, y 및 z 좌표를 나타내는 3 개의리스트 (xTool, yTool, zTool)에있는 포인트 좌표로 시작합니다.파이썬에서 2 차원 배열을 정렬하는 법

여기서 목표는 3 열과 많은 행 (10,000 이상)의 행렬을 만드는 것입니다. 각 행은 점의 3 좌표를 나타냅니다. 당신이 정말로

rTool = numpy.zeros_like(Tool) 
for rt in xrange((len(xTool) - 1)): 
    rTool[rt][0] = (Tool[rt][0] * cos(angle)) - (Tool[rt][1] * sin(angle)) 
    rTool[rt][1] = (Tool[rt][0] * sin(angle)) + (Tool[rt][1] * cos(angle)) 
    rTool[rt][2] = Tool[rt][2] 
마지막으로

, 난 할 노력하고있어하는 순서입니다 내가 뭘하는지 이해하려는 경우에만,이 사소한 중요성을 가지고 (: 내가 할 다음 단계는 벡터과 같이 변환입니다 내 rTool 내 2 번째 칼럼 ([1])에 관해서. 예를 들어, 내 rTool 5 항목을 인쇄했습니다. 두 번째 열에 따라 정렬하여 마지막 행이 첫 번째 있어야합니다. 정말이 작업을 수행하는 오전, 그리고 내가 대신 실제 3 열 수학 행렬의 튜플을 가지고 있기 때문에 그것의 생각한다.

[[ -584.89837646 -3648.6472168 402.177948 ] 
[ -542.8659668 -3663.34545898 405.76959229] 
[ -500.831604 -3678.04785156 409.32122803] 
[ -458.79336548 -3692.75854492 412.7930603 ] 
[ -416.74984741 -3637.48022461 416.15090942]] 

는 clarificati을 요청하는 것을 망설이지 말라 그리고 당신이 나를 도울 수 있기를 바랍니다! 감사. 당신이 찾고있는

rTool.sort(key=lambda x: x[1]) 

또는

rToolSorted = sorted(rTool, key=lambda x: x[1]) 
+0

비슷한 질문이 5 년 전 http://stackoverflow.com/questions/613183/sort-a-python-dictionary-byvalue –

+0

좌표에 튜플을 사용할 수 있으므로 트리플 ['(x, y, z,) (x, y, z)]'리스트. 튜플은 불변이지만 빠릅니다. – data

답변

1

먼저 할 수있는 무엇보다도, NumPy와 내용. 평범한 파이썬에서 이런 종류의 일을하는 것은 모든 것에 반대합니다.

sorted_rtool = rTool[np.argsort(rTool[:,1])] 

이 NumPy와 가정의 중요성을 드라이브 : 당신이 완료하면

rTool = np.dot(Tool, R) 

는 크기는 또한 주문 빠른뿐만 아니라 많은 청소기입니다.

+0

왜 모든 것이 pythonic *에 맞습니까? – will

+0

'Everything'은 큰 단어지만 상상할 수있는 모든면에서 그 직업에 대한 잘못된 도구 일뿐입니다. 파이썬에서 행렬 곱셈과 같은 것들을 재발 명하는 것은 시작을위한 바퀴를 재발 명하는 나쁜 경우입니다. 또한 코드의 의도를 모호하게하고, 버그가 발생하기 쉽고 성능이 엄청난 차이를 보장합니다. –

+0

나는 그것이 사실이라고 종종 말할 것이다. 그러나 numpy가 행렬 곱셈과 np.dot()를 재사용하는 방법과 짝을 이루는 제품과 점 제품을 사용하는 방식을 정말로 좋아하지 않는다. 나는 그것이 실제로 일어나고있는 것을 obsucres로 unpythonic다는 것을이라고와 주장 할 것입니다. "파이누 닉을 더 많이 만들 수 있고 휠을 재발 명할 수 없기 때문에 numpy를 사용하라"라고 말하면,'matrix' 클래스를 사용하는 것이 좋습니다. 그러면'M * N'을 통해 무엇을 얻을 수 있을까요? 네가 원해. 어느 쪽이 더 논쟁하겠습니까?'np.dot (M, N)' – will

0

당신은 귀하의 경우에는 https://wiki.python.org/moin/HowTo/Sorting#Key_Functions

를 참조하십시오 '분류' '종류'또는의 '키'매개 변수를 사용할 수 있습니다 key 키워드가 list.sort() (또는 내장형 sorted()) 인 경우 Key Functions 섹션 here을 확인하십시오.

종종 사람들은 정렬 키에 람다 함수를 사용합니다. 간결한 것처럼 사람들은 종종 정렬 함수를 두 번 이상 사용하지 않습니다. 모두는, 목록의 각 요소가 정렬되는 객체 key을 반환하는 함수입니다.

그래서 당신은 할 수 :

def keyFunc(element): 
    return element[1] 

rTool.sort(key=keyFunc) 

나 : 두 경우 모두

rTool.sort(key=lambda x: x[1]) 

을, 당신은 차이가 list.sort()는 인플레 이스 종류의 수행, 그리고 만약 더 효율적임을되고, 대신 rTool = sorted(rTool, key=...)을 사용할 수 있습니다 원래 배열은 필요 없습니다. key 기능은 정말 당신이 원하는 무엇이든 할 수있다

, 그것은 정렬 할 수 있습니다 뭔가를 반환 제공하므로 포인트 x, y, z 속성을 가진 개체가 있다면, 당신은 rTool.sort(key x: x.y)

관련 문제