2012-12-15 3 views
1

정렬 된 쌍의 목록 (격자 좌표를 나타내는)을 저장하기 위해 numpy 배열을 사용하고 있습니다. 필자가 작성한 알고리즘은 새로 생성 된 정렬 된 쌍이 이미이 배열에 있는지 확인해야합니다. 다음은 코드의 회로도입니다.numpy 배열로 정렬 된 쌍을 찾습니다.

cluster=np.array([[x1,y1]]) 
cluster=np.append(cluster,[[x2,y2]],axis=0) 
cluster=np.append...etc. 

new_spin=np.array([[x,y]]) 

if new_spin in cluster==False: 
    do something 

이 코드의 문제점은 위양성입니다. x 또는 y가 클러스터에 나타나면 new_spin in cluster이 true로 평가됩니다. 처음에 나는 xycluster에 나타나는지 간단하게 고쳐야한다고 생각했으나 순서쌍으로 나타나지는 않습니다. 그들이 주문한 쌍으로 나타나는 것을 확인하기 위해 나는 xy이 나타나는 곳에 색인을 찾아야 만하고, 그것들을 비교해 보았습니다. 그것들은 매우 clunky하고 세련되지 않은 것처럼 보이고, 더 나은 해결책이 있어야합니다. 그러나, 나는 그것을 스스로 해결할 수 없었다.

도움 주셔서 감사합니다. 예를 통해

+0

numpy <1.7.와 관련이있는 작은 버그로 인해 다소 귀찮습니다.하지만 동일한 세트를 여러 번 쿼리하면 정렬을 사용하거나 'scipy.spatial.cKDTree'로 무언가를 해킹해야합니다. numpy의 현재 버그가 너무 성가시다면. – seberg

답변

4

하자 일 :

In [7]: import numpy as np 
In [8]: cluster = np.random.randint(10, size = (5,2)) 
In [9]: cluster 
Out[9]: 
array([[9, 7], 
     [7, 2], 
     [8, 9], 
     [1, 3], 
     [3, 4]]) 

In [10]: new_spin = np.array([[1,2]]) 

In [11]: new_spin == cluster 
Out[11]: 
array([[False, False], 
     [False, True], 
     [False, False], 
     [ True, False], 
     [False, False]], dtype=bool) 

new_spin == cluster는 DTYPE bool의 NumPy와 배열입니다. cluster의 값이 new_spin의 해당 값과 같으면 True입니다. new_spin를 들어

cluster "의"위 부울 배열의 모두 충족해야합니다. 행의 any 모두 True 인 경우

In [12]: (new_spin == cluster).all(axis = 1) 
Out[12]: array([False, False, False, False, False], dtype=bool) 

그래서 new_spin, cluster "에서"입니다 : : 그런데

In [13]: 
In [14]: (new_spin == cluster).all(axis = 1).any() 
Out[14]: False 

, np.append 우리는 all(axis = 1) 메서드를 호출하여 이러한 행을 찾을 수 있습니다 매우 느린 작업입니다 - Python list.append보다 느립니다. 기회는 당신이 np.append를 피하면 훨씬 더 좋은 성적을 얻을 수 있습니다. cluster이 너무 크지 않다면 적어도 목록 추가를 마칠 때까지 클러스터 목록을 파이썬 목록으로 만드는 것이 좋습니다. 그런 다음 필요에 따라 clustercluster = np.array(cluster)으로 numpy 배열로 변환하십시오.

+0

나는 간단히'(x, y) in cluster '문장을 사용하여 질의 할 수있는리스트리스트를 사용했다. (친구들 중 한 명은리스트가 배열보다 더 빨리 사용되어야한다고 지적했기 때문에 배열이 될 필요는 없었습니다. 저는 데이터 형식으로 작업하는 데 익숙했습니다. 배열 사용에 대한 귀하의 답변을 좋아합니다. 모든 축이 축을 사용할 수 있다는 것을 알고있는 것이 좋습니다. –

+0

@DylanB 내장 데이터 유형에서,'set'은리스트보다 더 선호 될 것입니다. 왜냐하면'in'은 훨씬 더 효율적이기 때문입니다. – seberg

관련 문제