我正在使用一个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。起初,我认为一个简单的解决方法是询问x
和y
是否出现在cluster
中,但这不能确保它们以有序对的形式出现。为了确保它们以有序对的形式出现,我必须找到x
和y
在cluster
中出现的索引并进行比较,这看起来很笨拙且不雅观,我敢肯定必须有一个更好的解决方案。但是,我自己却无法解决。谢谢你的帮助。
最佳答案
让我们来看一个例子:
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
中”,上述布尔数组的一行必须全部为True。我们可以通过调用all(axis = 1)
方法找到这样的行:In [12]: (new_spin == cluster).all(axis = 1)
Out[12]: array([False, False, False, False, False], dtype=bool)
因此,如果行中的
new_spin
全部为True,则cluster
为“ any
中的”:In [13]:
In [14]: (new_spin == cluster).all(axis = 1).any()
Out[14]: False
顺便说一句,
np.append
是一个非常慢的操作-比Python list.append
慢。如果避免使用np.append
,则可能会获得更好的性能。如果cluster
不太大,最好将集群设为列表的Python列表-至少直到完成附加项为止。然后,如果需要,用cluster
将cluster = np.array(cluster)
转换为numpy数组。关于python - 检测numpy数组中的有序对,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13888893/