2012-11-22 4 views
4

나는 입자 시뮬레이터로 놀고있다. 가능한 한 효율적으로 현실적인 시뮬레이터를 만들기 위해 파이썬과 numpy로 matplotlib를 사용하고 싶다. (이것은 단지 재미있는 연습이다. 파이썬과) 거리의 역수를 계산하는 데 문제가 있습니다.배열의 파이썬/누피 인덱스 배열

I은 ​​너무 유사 입자의 위치 (X, Y)를 포함하는 배열을 가지고

x = random.randint(0,3,10).reshape(5,2) 
>>> x 
array([[1, 1], 
    [2, 1], 
    [2, 2], 
    [1, 2], 
    [0, 1]]) 

이것은 [0,3] 위치에있는 5 개 개의 입자 (x, y)이다. 나는 하나 개의 입자 사이의 거리를 계산하려면 지금 문제는 내가의 거리를 먹고 싶어하지 마십시오되고 나머지는 내가

>>>x - [0,1] 
array([[1, 0], 
    [2, 0], 
    [2, 1], 
    [1, 1], 
    [0, 0]]) 

같은 것을 할 것 (예를 들어 위치에 입자 (0,1)) 및 입자 자체 : (0,0). 이것은 길이가 0이고 역수는 무한하며 중력이나 coloumb force에 대해 정의되지 않습니다.

그래서 시도 : 여기서 (X == [0,1])는 X

배열에서 (0,1)의 입자의 위치가 아닌
>>>where(x==[0,1]) 
(array([0, 1, 4, 4]), array([1, 1, 0, 1])) 

. 그렇다면 어떻게 x와 같은 배열에서 [0,1]의 위치를 ​​고를 수 있습니까? 위의 where()는 x가 0 또는 1과 같은지 확인합니다. 여기서 x는 [0,1]과 같습니다. 반복없이 "numpylike"어떻게해야합니까?

추신 : 어떻게하면 당신은 복사 - 붙여 넣기 코드 stackoverflow에 복사합니까? 나는 나쁜 포럼이 코드를 들여 쓰는 동안 15 분 동안 코드를 들여야하지만 (우분투의 크롬 탭은 단순히 4 개의 공백을 들여 쓰지 않고 창문 밖으로 튀어 나와 있기 때문에) [code] .. [/ code] 매우 짜증나. !하지 나는 = [1,1]없이 배열을 반환해야합니다, 바라던 것입니다

x 
array([[0, 2], 
     [2, 2], 
     [1, 0], 
     [2, 2], 
     [1, 1]]) 
>>> all(x==[1,1],axis=1) 
array([False, False, False, False, True], dtype=bool) 
>>> all(x!=[1,1], axis=1) 
array([ True, True, False, True, False], dtype=bool) 

:

편집 : 나는 시도 첫 번째 대답을보고. 그러나 슬프게도, 그것은 하나의 (1,0) 그리워 :

>>>x[all(x!=[1,1], axis=1)] 
array([[0, 2], 
     [2, 2], 
     [2, 2]]) 

Edit2가을 : 어떤 트릭을했다, 그것이 내가 생각하는 모든 것보다 더 논리적 의미가 있습니다, 감사합니다!

+4

코드를 복사하여 붙여 넣기 만하면됩니다. 코드를 선택하고'Ctrl + K '(또는'code' 툴바 버튼)을 눌러 코드로 포맷하십시오. – voithos

답변

5
>>> import numpy as np 
>>> x=np.array([[1, 1], 
... [2, 1], 
... [2, 2], 
... [1, 2], 
... [0, 1]]) 
>>> np.all(x==[0,1], axis=1) 
array([False, False, False, False, True], dtype=bool) 
>>> np.where(np.all(x==[0,1], axis=1)) 
(array([4]),) 
>>> np.where(np.any(x!=[0,1], axis=1)) 
(array([0, 1, 2, 3]),) 
+0

아, 고맙습니다. 이제 numpy 색인 생성의 성배에 액세스 할 수 있다고 생각했지만 x! = [a, b]를 수행하고 예상했던 것을 얻지 못했습니다. 위의 편집을 참조하십시오. – arynaq

+0

@ user948652'! ='와 함께'all' 대신'any'를 사용하십시오. 수정 된 답변 –