Як в Python я можу створити нумерований масив довільної форми, наповнений усіма значеннями True або All False?
Як в Python я можу створити нумерований масив довільної форми, наповнений усіма значеннями True або All False?
Відповіді:
numpy вже дозволяє легко створювати масиви всіх або всіх нулів:
наприклад numpy.ones((2, 2))
абоnumpy.zeros((2, 2))
Оскільки True
і False
представлені в Python як 1
і 0
, відповідно, нам залишається лише вказати, що цей масив повинен бути булевим, використовуючи необов'язковий dtype
параметр, і ми закінчили.
numpy.ones((2, 2), dtype=bool)
повертає:
array([[ True, True],
[ True, True]], dtype=bool)
ОНОВЛЕННЯ: 30 жовтня 2013 року
Оскільки нумерована версія 1.8 , ми можемо використовувати full
для досягнення такого ж результату синтаксис, який більш чітко показує наш намір (як вказує fmonegaglia):
numpy.full((2, 2), True, dtype=bool)
ОНОВЛЕННЯ: 16 січня 2017 року
Оскільки принаймні нумерована версія 1.12 , full
автоматично передає результати dtype
другому параметру, тому ми можемо просто написати:
numpy.full((2, 2), True)
a=np.ones((2,2))
після a.dtype=bool
чого НЕ працює.
numpy.full((2,2), True, dtype=bool)
ones
та zeros
відповіді не будують масив цілих чисел. Вони будують масив булів безпосередньо.
numpy.full((2,2), True)
еквівалент?
int 1
в bool True
.
ones
і zeros
, які створюють масиви, повні одиниць і нулів відповідно, приймають необов'язковий dtype
параметр:
>>> numpy.ones((2, 2), dtype=bool)
array([[ True, True],
[ True, True]], dtype=bool)
>>> numpy.zeros((2, 2), dtype=bool)
array([[False, False],
[False, False]], dtype=bool)
Якщо це не обов’язково для запису, ви можете створити такий масив за допомогою np.broadcast_to
:
>>> import numpy as np
>>> np.broadcast_to(True, (2, 5))
array([[ True, True, True, True, True],
[ True, True, True, True, True]], dtype=bool)
Якщо вам це потрібно для запису, ви також можете створити порожній масив і fill
самостійно:
>>> arr = np.empty((2, 5), dtype=bool)
>>> arr.fill(1)
>>> arr
array([[ True, True, True, True, True],
[ True, True, True, True, True]], dtype=bool)
Ці підходи є лише альтернативними пропозиціями. Як правило, ви повинні дотримуватися np.full
, np.zeros
або np.ones
як це пропонують інші відповіді.
Швидко пробіг час, щоб побачити, чи є різниці між версією np.full
та np.ones
.
Відповідь: Ні
import timeit
n_array, n_test = 1000, 10000
setup = f"import numpy as np; n = {n_array};"
print(f"np.ones: {timeit.timeit('np.ones((n, n), dtype=bool)', number=n_test, setup=setup)}s")
print(f"np.full: {timeit.timeit('np.full((n, n), True)', number=n_test, setup=setup)}s")
Результат:
np.ones: 0.38416870904620737s
np.full: 0.38430388597771525s
ВАЖЛИВО
Щодо публікації про np.empty
(і я не можу коментувати, оскільки моя репутація занадто низька):
НЕ РОБИТИ ЦЕ. НЕ ВИКОРИСТОВУЙТЕ, np.empty
щоб ініціалізувати всі True
масиви
Оскільки масив порожній, пам'ять не записується і немає гарантії, якими будуть ваші значення, наприклад
>>> print(np.empty((4,4), dtype=bool))
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True False False]]
>>> a = numpy.full((2,4), True, dtype=bool)
>>> a[1][3]
True
>>> a
array([[ True, True, True, True],
[ True, True, True, True]], dtype=bool)
numpy.full (Розмір, Скалярне значення, Тип). Також можуть бути передані інші аргументи, щоб отримати документацію про це, перевірте https://docs.scipy.org/doc/numpy/reference/generated/numpy.full.html
np.full
- більше року тому!