Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在numpy数组中检测有序对_Python_Numpy - Fatal编程技术网

Python 在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 当前代码的问

我使用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\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
是一个非常慢的操作——比Python
list.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
是一个非常慢的操作——比Python
list.append
慢。如果您避免
np.append
,您可能会获得更好的性能。如果
cluster
不是太大,那么最好让cluster成为一个Python列表——至少在您完成附加项之前是这样。然后,如果需要,将
cluster
转换成一个带有
cluster=np的numpy数组。array(cluster)

这有点烦人,因为numpy中有一个与之相关的小错误这有点烦人,因为numpy中有一个与之相关的小错误。我最终使用了一个列表列表列表列表,可以使用一个简单的
(x,y)进行查询在cluster
语句中没有问题(因为我的一个朋友指出列表应该比数组更快使用,而且我并不真的需要它成为数组——我只是习惯于将它们作为数据类型使用)。我喜欢你关于使用数组的回答,很高兴知道任何一个都可以接受轴。@DylanB从内置数据类型来看,
set
很可能比列表更好,因为它在
中的
效率更高。我确实使用了列表列表,可以使用简单的
(x,y)查询列表在cluster
语句中没有问题(因为我的一个朋友指出列表应该比数组更快使用,而且我并不真的需要它成为数组——我只是习惯于将它们作为数据类型使用)。我喜欢你使用数组的答案,很高兴知道任何一个都可以接受轴。@DylanB从内置数据类型来看,
set
很可能比列表更可取,因为它在
中的
效率更高。