Какой самый быстрый способ проверить, имеет ли многомерный массив с нулевыми значениями 0 со всех сторон?
Итак, для простого примера 2D, у меня есть:
x = np.random.rand(5, 5)
assert np.sum(x[0:, 0]) == 0
assert np.sum(x[0, 0:]) == 0
assert np.sum(x[0:, -1]) == 0
assert np.sum(x[-1, 0:]) == 0
Хотя для 2D-случаев это нормально, писать для более высоких измерений немного утомительно, и мне было интересно, есть ли какой-нибудь умный хитрый прием, который я могу использовать здесь, чтобы сделать его эффективным и более удобным в обслуживании.
np.all (x[:, 0] == 0)
будет безопаснее, чем сумма? Проверка суммы верна, только если все числа положительны.Ответы:
Вот как вы можете это сделать:
np.take
делает то же самое, что и "модная" индексация.источник
numpy.take
делает копию. Это может привести к тому, что он будет работать хуже, чем код, основанный на представлении. (Время было бы необходимо, чтобы быть уверенным - эффективность представления NumPy иногдаlen(x.shape)
можно написать прощеx.ndim
.all
короткое замыкание. Вы можете снять скобки, чтобы использовать выражение генератора, позволяющееall
вернуться, как только одинnumpy.all
вызов вернетсяFalse
.Вот ответ, который на самом деле исследует части интересующего вас массива и не тратит время на создание маски размером всего массива. Есть цикл уровня Python, но он короткий, с итерациями, пропорциональными количеству измерений, а не размеру массива.
источник
not (view[0] == 0).all()
не эквивалентныview[0].any()
?view[0].any()
будет работать тоже. Я не совсем уверен в последствиях приведения типов и буферизации к двум вариантам -view[0].any()
теоретически они могут быть реализованы быстрее, но раньше я видел странные результаты и не до конца понимаю, что такое буферизация.view[0].view(bool).any()
было бы скоростное решение.argmax
может фактически превзойтиany
логическое представление . Этот материал становится странным.argmax
илиany
, используя логические средства обработки вида отрицательный нуля , как неравномерные к обычному нулю.)Я изменил массив, а затем повторил его. К сожалению, мой ответ предполагает, что у вас есть по крайней мере три измерения, и вы получите ошибку для нормальных матриц, вам придется добавить специальное предложение для 1 и 2-мерных массивов. Кроме того, это будет медленно, так что, вероятно, есть лучшие решения.
Который будет производить
В основном я укладываю все размеры друг на друга, а затем просматриваю их, чтобы проверить их края.
источник
возможно, вы ищете оператор многоточия, который будет работать для многих измерений:
источник
Вы можете использовать
slice
и логическое маскирование для выполнения работы:Эта функция сначала формирует «ядро» массива в кортеж
s
, а затем создает маску, которая отображаетсяTrue
только для граничных точек. Затем логическое индексирование доставляет граничные точки.Рабочий пример:
Затем,
np.all(borders==0)
даст вам необходимую информацию.Примечание: это ломается для одномерных массивов, хотя я рассматриваю их как крайний случай. Тебе, наверное, лучше просто проверить эти два вопроса
источник
np.arange(15)
не включает 15.