Python Numpy:检查数组中所有元素是否具有相同符号的最快方法?

Python Numpy:检查数组中所有元素是否具有相同符号的最快方法?,python,numpy,Python,Numpy,我正在寻找一种优化或可爱的方法来检查数组的所有元素是否具有相同的符号(严格来说) 我一直在考虑做: N.all(my_array*my_array[0]>0) 因为它会检查所有元素是否与第一个元素具有相同的符号,因此符号相同,但看起来并不可爱或优雅。将整个数组相乘似乎是一种浪费。只要看看第一个元素的符号,用它,我会说: N.all(my_array > 0) if my_array[0] > 0 else N.all(my_array < 0) N.all(我的数组>

我正在寻找一种优化或可爱的方法来检查数组的所有元素是否具有相同的符号(严格来说)

我一直在考虑做:

N.all(my_array*my_array[0]>0)

因为它会检查所有元素是否与第一个元素具有相同的符号,因此符号相同,但看起来并不可爱或优雅。

将整个数组相乘似乎是一种浪费。只要看看第一个元素的符号,用它,我会说:

N.all(my_array > 0) if my_array[0] > 0 else N.all(my_array < 0)
N.all(我的数组>0)如果我的数组[0]>0,其他N.all(我的数组<0)
试试这个:

len(N.unique(N.sign(a)))==1

这似乎仍然有点低效
numpy.sign
O(N)
也是
numpy.unique
所以这是一个
O(N^2)
解决方案@RemcoGerlich的解决方案是
O(N)
。你是对的。我的意思是,这必须迭代整个数组两次,而不是一次。我知道没有这样的东西,但它就像是一个
O(2N)
解决方案,而不是
O(N)
我不知道你是否测试了这个代码,但它没有做你认为它做的事情。首先,
np.all
采用类似于数组的参数,而生成器不是类似于数组的。尝试
np.all(范围(10)中的i为1==0)
。您可以通过使用内置的
all
或使用列表理解而不是生成器表达式来处理此问题,但您的代码仍然无法工作。您正在测试每个元素是否等于第一个元素,而不是它们的符号是否相同。我想你可能是想在某个地方用一个
np.符号
,然后忘了。故事的寓意是,始终测试您的代码。您仍然存在生成器表达式的问题。一旦你解决了这个问题,时间就会大不相同。
unique
实际上是
O(n log n)
,因为它使用排序来发现重复的项目。只是简单地说,如果所有元素都是
0
,你就错过了(尽管这是一个很小的例子)。在这种情况下,它将返回
False
,尽管它们在技术上都有相同的符号。我将他的“严格”相同符号解释为意味着一切都必须严格为正或严格为负,就像他的代码一样。是的,这个解决方案可能会很好地工作。我只是把它带来了,因为如果你看他们考虑<代码> { 1, 0, 1 } <代码>。注意,这个解决方案仍然会创建一个布尔值的临时数组,然后再迭代这个临时数组来查找标志。如果您确实想要最快的解决方案,请使用
numba
cython
weave