Как создать массив numpy из всех True или all False? - программирование
Подтвердить что ты не робот

Как создать массив numpy из всех True или all False?

В Python, как создать массив numpy произвольной формы, заполненный всем True или all False?

4b9b3361

Ответ 1

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)

Ответ 2

numpy.full((2,2), True, dtype=bool)

Ответ 3

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)

Ответ 4

Если это не нужно записывать, вы можете создать такой массив с 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, как предлагают другие ответы.

Ответ 5

>>> 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

Ответ 6

Просто для того, чтобы добавить больше ответов, вот еще один способ создания логического массива произвольной формы. Шаги говорят сами за себя.

# desired shape
In [42]: shape = (2, 3)

In [43]: true_arr = np.empty(shape, dtype=np.bool)

# when needed an array with 'False'y values, just negate the 'True'thy values
In [44]: false_arr = ~np.empty(shape, dtype=np.bool)

In [45]: true_arr
Out[45]: 
array([[ True,  True,  True],
       [ True,  True,  True]], dtype=bool)

In [46]: false_arr
Out[46]: 
array([[False, False, False],
       [False, False, False]], dtype=bool)

Ответ 7

Быстро запустил 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 для инициализации массива all- True

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

>>> print(np.empty((4,4), dtype=bool))
[[ True  True  True  True]
 [ True  True  True  True]
 [ True  True  True  True]
 [ True  True False False]]