удивительным объяснение, данное в Ubuntu, вы можете использовать reduce
, чтобы решить вашу проблему, но вы должны применить его к bitwise_and
и bitwise_or
, а не equal
. Как следствие, это не будет работать с точечными массивами плавающими:
In [60]: np.bitwise_and.reduce(a) == a[0]
Out[60]: array([ True, False, True], dtype=bool)
In [61]: np.bitwise_and.reduce(b) == b[0]
Out[61]: array([ True, False, True], dtype=bool)
В принципе, вы сравниваете биты каждого элемента в столбце. Идентичные биты не изменяются. Различные биты устанавливаются на ноль. Таким образом, любое число, которое имеет нуль вместо одного бита, изменит приведенное значение. bitwise_and
не будет ловушка случай, когда биты введены, а не удалены:
In [62]: c = np.array([[1,0,0],[1,0,0],[1,0,0],[1,1,0]])
In [63]: c
Out[63]:
array([[1, 0, 0],
[1, 0, 0],
[1, 0, 0],
[1, 1, 0]])
In [64]: np.bitwise_and.reduce(c) == c[0]
Out[64]: array([ True, True, True], dtype=bool)
Второй coumn явно не так.Нам нужно использовать bitwise_or
улавливать новые биты:
In [66]: np.bitwise_or.reduce(c) == c[0]
Out[66]: array([ True, False, True], dtype=bool)
Окончательный ответ
In [69]: np.logical_and(np.bitwise_or.reduce(a) == a[0], np.bitwise_and.reduce(a) == a[0])
Out[69]: array([ True, False, True], dtype=bool)
In [70]: np.logical_and(np.bitwise_or.reduce(b) == b[0], np.bitwise_and.reduce(b) == b[0])
Out[70]: array([ True, False, True], dtype=boo
In [71]: np.logical_and(np.bitwise_or.reduce(c) == c[0], np.bitwise_and.reduce(c) == c[0])
Out[71]: array([ True, False, True], dtype=bool)
Этот метод является более жестким и менее элегантно, чем предложение ubunut в использовании all
, но он имеет преимущество не создавая огромные временные массивы, если ваш вход огромен. Временные массивы должны быть только размером с первую строку вашей матрицы.
EDIT
На основе этого Q/A и the bug I filed with numpy, предлагаемое решение работает только потому, что ваш массив содержит нули и единицы. Как это бывает, приведенные операции bitwise_and.reduce()
могут возвращать только один или два нуля, потому что bitwise_and.identity
- 1
, а не -1
. Я сохраняю этот ответ в надежде, что numpy
будет исправлен, и ответ станет действительным.
Редактировать
Похоже, там будет на самом деле быть изменение Numpy в ближайшее время. Конечно, до bitwise_and.identity
, а также, возможно, необязательный параметр для уменьшения.
Редактировать
Хорошие новости все. Идентификатор для np.bitwise_and
был установлен в -1
с версии 1.12.0
.
Эта проблема прослушивает меня некоторое время. В то время как решение @ Ubuntu достаточно изящно, не очень приятно пытаться запустить это на 4096 ** 3 двойном массиве только для того, чтобы получить булевский массив, который запустил всю оставшуюся память. Я играл с чистой реализацией Python, используя 'np.equal (a, a [:, 0, None])', но это заканчивается той же проблемой. Поэтому я работаю над PR для numpy, чтобы добавить новую функцию 'np.same', чтобы обрабатывать именно такую ситуацию. –