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

7

我希望你能提供一种优化或简洁的方法来检查数组的所有元素是否具有相同的符号(严格要求)。

我一直在思考:

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

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

2个回答

8

看起来把整个数组都乘起来有点浪费。我觉得只需要查看第一个元素的符号,然后使用就好了:

N.all(my_array > 0) if my_array[0] > 0 else N.all(my_array < 0)

1
只是为了引入一个边缘情况,如果所有元素都是“0”(虽然这是一个微不足道的情况),你会错过它。在这种情况下,尽管它们在技术上都具有相同的符号,但它将返回“False”。 - Cory Kramer
1
我理解他的“_strictly_”符号意味着一切都必须严格为正或严格为负,就像他的代码一样。 - RemcoGerlich
是的,这个解决方案可能很好用。我提出这个问题只是因为如果你看一下numpy.sign,它们考虑了{-1, 0, 1} - Cory Kramer
请注意,即使使用这种解决方案,仍然会创建一个布尔值临时数组,然后再次迭代该临时数组以查找符号。如果您真的想要最快的解决方案,请使用 numbacythonweave - Michael

3

试试这个:

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

这仍然似乎有点低效。numpy.signO(N)numpy.unique也是如此,因此这是一个O(N^2)的解决方案。@RemcoGerlich的解决方案是O(N) - Cory Kramer
你说得对。我的意思是这个程序需要两次遍历整个数组,而不是只遍历一次。我知道这并不存在,但它就像一个O(2N)的解决方案,而不是O(N) - Cory Kramer
你仍然有生成器表达式的问题。一旦你解决了这个问题,时间会有很大的不同。 - Bi Rico
@BiRico,确实时间完全改变了。由于该方法比给定的方法复杂了两倍,因此将其删除。谢谢。 - Irshad Bhat
4
“unique”实际上是“O(n log n)”的,因为它使用排序来识别重复项。 - Jaime
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接