Python 在numpy数组中检测有序对
我使用numpy数组来保存有序对的列表(表示网格坐标)。我正在编写的算法需要检查新生成的有序对是否已经在这个数组中。下面是代码的示意图:Python 在numpy数组中检测有序对,python,numpy,Python,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 当前代码的问
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\u spin in cluster
的计算结果为true。起初,我认为一个简单的解决办法是询问x
和y
是否出现在集群中,但这并不能确保它们以有序对的形式出现。为了确保它们以有序对的形式出现,我必须找到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\u spin==cluster
是一个数据类型为bool
的numpy数组。如果簇中的值等于新旋转中的相应值,则为真
要使new\u spin
位于cluster
中,上述布尔数组的行必须全部为真。我们可以通过调用all(axis=1)
方法找到这些行:
In [12]: (new_spin == cluster).all(axis = 1)
Out[12]: array([False, False, False, False, False], dtype=bool)
因此new\u spin
是“在”cluster
,如果行中的任何一行都是真的:
In [13]:
In [14]: (new_spin == cluster).all(axis = 1).any()
Out[14]: False
顺便说一下,np.append
是一个非常慢的操作——比Pythonlist.append
慢。如果您避免np.append
,您可能会获得更好的性能。如果cluster
不是太大,那么最好让cluster成为一个Python列表——至少在您完成附加项之前是这样。然后,如果需要,将cluster
转换为cluster=np的numpy数组。数组(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\u spin==cluster
是一个数据类型为bool
的numpy数组。如果簇中的值等于新旋转中的相应值,则为真
要使new\u spin
位于cluster
中,上述布尔数组的行必须全部为真。我们可以通过调用all(axis=1)
方法找到这些行:
In [12]: (new_spin == cluster).all(axis = 1)
Out[12]: array([False, False, False, False, False], dtype=bool)
因此new\u spin
是“在”cluster
,如果行中的任何一行都是真的:
In [13]:
In [14]: (new_spin == cluster).all(axis = 1).any()
Out[14]: False
顺便说一下,np.append
是一个非常慢的操作——比Pythonlist.append
慢。如果您避免np.append
,您可能会获得更好的性能。如果cluster
不是太大,那么最好让cluster成为一个Python列表——至少在您完成附加项之前是这样。然后,如果需要,将cluster
转换成一个带有cluster=np的numpy数组。array(cluster)
这有点烦人,因为numpy中有一个与之相关的小错误这有点烦人,因为numpy中有一个与之相关的小错误。我最终使用了一个列表列表列表列表,可以使用一个简单的(x,y)进行查询在cluster
语句中没有问题(因为我的一个朋友指出列表应该比数组更快使用,而且我并不真的需要它成为数组——我只是习惯于将它们作为数据类型使用)。我喜欢你关于使用数组的回答,很高兴知道任何一个都可以接受轴。@DylanB从内置数据类型来看,set
很可能比列表更好,因为它在
中的效率更高。我确实使用了列表列表,可以使用简单的(x,y)查询列表在cluster
语句中没有问题(因为我的一个朋友指出列表应该比数组更快使用,而且我并不真的需要它成为数组——我只是习惯于将它们作为数据类型使用)。我喜欢你使用数组的答案,很高兴知道任何一个都可以接受轴。@DylanB从内置数据类型来看,set
很可能比列表更可取,因为它在
中的效率更高。