1

我正在使用一个 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评估为真。起初我认为一个简单的解决方法是询问是否出现在 中,但这并不能确保它们显示为有序对x。为了确保它们以有序对的形式出现,我必须找到出现的索引并比较它们,这看起来非常笨重和不雅,我确信那里一定有更好的解决方案。但是,我自己无法解决。yclusterxycluster

谢谢你的帮助。

4

1 回答 1

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 的 numpy 数组boolcluster如果 in 的值等于 中的相应值,则为 True new_spin

new_spin成为 "in" cluster,上述布尔数组的一行必须全部为 True。我们可以通过调用all(axis = 1)方法找到这样的行:

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

new_spin"in" 也是如此cluster,如果any所有行都为真:

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

顺便说一句,np.append这是一个非常慢的操作——比 Python 慢list.append。如果您避免使用 ,您可能会获得更好的性能np.append。如果cluster不是太大,则最好将 cluster 制作为 Python 列表列表 - 至少在您完成附加项目之前。然后,如果需要,使用 . 转换cluster为 numpy 数组cluster = np.array(cluster)

于 2012-12-15T03:07:59.477 回答