2015-01-20 4 views
6

Я ищу оптимизированный или симпатичный способ проверки, если все элементы массива имеют один и тот же знак (строго).Numpy: самый быстрый способ проверить, имеют ли все элементы в массиве одинаковые знаки?

Я думал о выполнении:

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

как было бы проверить, если все элементы имеют один и тот же знак, что и первый, и поэтому один и тот же знак, но это не кажется мило или элегантными ,

ответ

7

Похоже, что это мусор, чтобы размножить весь массив. Просто посмотрите на знак первого элемента и использовать это, я бы сказал:

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

Просто бросить краевой случай, если вы пропустили, если все элементы являются '0' (хотя это тривиальный случай). В этом случае он вернет «False», хотя они технически все имеют один и тот же знак. – CoryKramer

+1

Я интерпретировал его «_strictly_» тот же знак, что означает, что все должно быть строго положительным или строго отрицательным, так как его код тоже – RemcoGerlich

+0

Да, это решение, вероятно, будет работать нормально. Я просто это понял, потому что, если вы посмотрите на ['numpy.sign'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.sign.html), они рассматривают' {-1, 0 , 1} '. – CoryKramer

3

Попробуйте это:

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

Это все еще кажется немного неэффективным. 'numpy.sign' -' O (N) ', и поэтому' numpy.unique', поэтому это решение «O (N^2)». Решение RemcoGerlich - «O (N)». – CoryKramer

+0

Вы правы. Я имел в виду, что это должно повторить весь массив дважды, а не только один раз. Я знаю, что такой вещи нет, но это похоже на решение «O (2N)» вместо «O (N)» – CoryKramer

+0

. Я не знаю, протестировал ли этот код, но он не делает то, что вы думаете , Во-первых, 'np.all' принимает аргумент array_like, а генераторы не похожи на массив. Попробуйте 'np.all (1 == 0 для i в диапазоне (10))'. Вы можете справиться с этим, используя встроенный 'all' или используя понимание списка вместо выражения генератора, но код еще не работает. Вы проверяете, равен ли каждый элемент первому, а не если их знаки одинаковы. Я думаю, вы, возможно, собираетесь использовать «np.sign» где-то и забыли. Мораль истории, всегда проверяйте свой код. –

Смежные вопросы