Python 仅比较numpy中的对象引用

Python 仅比较numpy中的对象引用,python,numpy,equality,Python,Numpy,Equality,我有一个Python对象的numpy数组。我想将数组与python对象进行比较,我不想与=运算符进行比较,但仅进行一次引用比较就足以满足我的要求 import numpy as np a = np.array(["abc", "def"], dtype="object") a == "abc" 我确信我的数组的引用副本就足够了。假设数组中的所有字符串都已被插入 这主要是为了在比较大量值时提高性能。Python对象比较非常慢 a是“abc”不会做我想做的事,因为 In [1]: import n

我有一个Python对象的numpy数组。我想将数组与python对象进行比较,我不想与
=
运算符进行比较,但仅进行一次引用比较就足以满足我的要求

import numpy as np
a = np.array(["abc", "def"], dtype="object")
a == "abc"
我确信我的数组的引用副本就足够了。假设数组中的所有字符串都已被插入

这主要是为了在比较大量值时提高性能。Python对象比较非常慢

a是“abc”不会做我想做的事,因为

In [1]: import numpy as np

In [2]: a = np.array(["abc", "def"], dtype="object")

In [3]: a == "abc"
Out[3]: array([ True, False], dtype=bool)

In [4]: a is "abc"
Out[4]: False
我希望
a==“abc”
的结果,但我不希望Python的
\uuuueq\uuuuuu
方法用于相同的操作,只希望
操作符

参考比较就足以满足我的要求

要比较对象标识,请使用
is
而不是
=

if a is b:
   ...
python -mtimeit -s 'import numpy as np' -s 'import random, string' -s 'a = np.array(["".join(random.choice(string.ascii_lowercase) for x in range(4)) for e in range(100000)])' -s 'vector_is = np.vectorize(lambda x,y: x is y, otypes=[bool])' 'a == "abcd"'                                        
1000 loops, best of 3: 1.42 msec per loop
从:

运算符
不为
测试对象标识:
x为y
当且仅当
x
y
为同一对象时为真
x不是y
产生反真值

编辑:要将
is
应用于数组的每个元素,可以使用:

In [6]: map(lambda x:x is "abc", a)
Out[6]: [True, False]
或者简单地说:

In [9]: [x is "abc" for x in a]
Out[9]: [True, False]
参考比较就足以满足我的要求

要比较对象标识,请使用
is
而不是
=

if a is b:
   ...
python -mtimeit -s 'import numpy as np' -s 'import random, string' -s 'a = np.array(["".join(random.choice(string.ascii_lowercase) for x in range(4)) for e in range(100000)])' -s 'vector_is = np.vectorize(lambda x,y: x is y, otypes=[bool])' 'a == "abcd"'                                        
1000 loops, best of 3: 1.42 msec per loop
从:

运算符
不为
测试对象标识:
x为y
当且仅当
x
y
为同一对象时为真
x不是y
产生反真值

编辑:要将
is
应用于数组的每个元素,可以使用:

In [6]: map(lambda x:x is "abc", a)
Out[6]: [True, False]
或者简单地说:

In [9]: [x is "abc" for x in a]
Out[9]: [True, False]
关于:

那你有

>>> a = np.array(["abc", "def"], dtype="object")

>>> vector_is(a, "abc")
array([ True, False], dtype=bool)
不幸的是,我不知道您是否可以使用
操作符。这里是
,因为我

ValueError: failed to determine the number of arguments for <built-in function is_>
最后一种方法,
np.fromiter((x是a中x的“abcd”),bool,len(a))
是从列表理解方法中获取numpy数组的一种方法

不幸的是,所有这些都比仅仅使用
==
慢得多:

if a is b:
   ...
python -mtimeit -s 'import numpy as np' -s 'import random, string' -s 'a = np.array(["".join(random.choice(string.ascii_lowercase) for x in range(4)) for e in range(100000)])' -s 'vector_is = np.vectorize(lambda x,y: x is y, otypes=[bool])' 'a == "abcd"'                                        
1000 loops, best of 3: 1.42 msec per loop
关于:

那你有

>>> a = np.array(["abc", "def"], dtype="object")

>>> vector_is(a, "abc")
array([ True, False], dtype=bool)
不幸的是,我不知道您是否可以使用
操作符。这里是
,因为我

ValueError: failed to determine the number of arguments for <built-in function is_>
最后一种方法,
np.fromiter((x是a中x的“abcd”),bool,len(a))
是从列表理解方法中获取numpy数组的一种方法

不幸的是,所有这些都比仅仅使用
==
慢得多:

if a is b:
   ...
python -mtimeit -s 'import numpy as np' -s 'import random, string' -s 'a = np.array(["".join(random.choice(string.ascii_lowercase) for x in range(4)) for e in range(100000)])' -s 'vector_is = np.vectorize(lambda x,y: x is y, otypes=[bool])' 'a == "abcd"'                                        
1000 loops, best of 3: 1.42 msec per loop

我不确定,你把我的问题问对了。例如在[1]:将numpy作为np导入[2]:a=np.array([“abc”,“def”],dtype=“object”)在[3]:a==“abc”Out[3]:array([True,False],dtype=bool)在[4]:a是“abc”Out[4]:False请查看结果中的差异a==“abc”和a是“abc”。我想要相同的结果a==“abc”,但我不想为相同的而只是“is”调用python对象eq方法。map将比a==“abc”花费大量时间,因为结果数组将是python数组。我不确定,我的问题你答对了。例如在[1]:将numpy作为np导入[2]:a=np.array([“abc”,“def”],dtype=“object”)在[3]:a==“abc”Out[3]:array([True,False],dtype=bool)在[4]:a是“abc”Out[4]:False请查看结果中的差异a==“abc”和a是“abc”。我想要相同的结果a==“abc”,但我不想为相同的而只是“is”调用python对象eq方法。map将比a==“abc”花费大量时间,因为结果数组将是python数组。不幸的是,这比a==“abc”慢,因为它无论如何都会涉及python方法调用(速度很慢).Right——如果
operator.is
工作,它可能会更快,但是
numpy.vectorize
出于某些愚蠢的原因不喜欢这样。不幸的是,这比a==“abc”慢,因为它无论如何都会涉及python方法调用(速度很慢)。对——如果
operator.is
工作,它可能会更快,但是
numpy.vectorize
出于某种愚蠢的原因不喜欢它。在仔细研究之后,我认为你不会得到任何超过纯Python中列表理解的东西(或者如果你确实想要一个numpy数组,那么我的答案中的
fromiter
)。如果你想在C语言中实现它,你可以看到
==
是如何实现的……在仔细研究之后,我认为你不会在纯Python中得到任何超过列表理解的东西(或者如果你确实想要一个numpy数组,那么我的答案中的
fromiter
)。如果您想在C中实现它,您可以看到
==
是如何实现的。。。。