В Python, как мне создать простой массив произвольной формы, заполненный полностью True или всеми False?
В Python, как мне создать простой массив произвольной формы, заполненный полностью True или всеми 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
Поскольку по крайней мере numpy версия 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
ответы не построить массив целых чисел. Они создают массив bools напрямую.
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
как другие ответы предполагают.
Быстро побежал timeit , чтобы увидеть, если есть какое - либо различие между 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
- более года назад!