Как создать простой массив всех True или All False?


Ответы:


285

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)


37
Вы ответили на свой вопрос в ту же минуту, когда вопрос был опубликован?
M4rtini

26
@ M4rtini SO позволяет публиковать вопрос и ответ на вопрос одновременно.
Мик МакКаллум

1
Инициализированный массив dtype = int нельзя использовать для выбора элементов массива.
Jichao

1
Это работает. Тем не менее, будьте осторожны, потому что, как говорит @Jichao, a=np.ones((2,2))после a.dtype=boolне работает.
medley56

8
Теперь известный мем: devhumor.com/media/…
WLGfx

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

12
+1 Я думаю, что это должен быть принятый ответ. Кажется более естественным заполнить массив bools, чем заполнить его числами, чтобы привести их к bools.
Зельфир Кальцталь

5
В onesи zerosответы не построить массив целых чисел. Они создают массив bools напрямую.
user2357112 поддерживает Monica

1
Это numpy.full((2,2), True)эквивалент?
Павел

Это в NumPy 1,12+. Я не помню, относится ли это к прежним версиям
fmonegaglia

Surly dtype хранится отдельно от самих данных, когда это возможно? Я не могу себе представить, чтобы numpy делал какие-то тяжелые работы, чтобы преобразовать их int 1в bool True.
BallpointBen

30

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)

10

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


3

Быстро побежал 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]]

0
>>> 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
Ну, другой ответ уже ответил с помощью np.full- более года назад!
MSeifert

0

ориентир для ответа Майкла Керри

import perfplot

bench_x = perfplot.bench(
    n_range= range(1, 200),
    setup  = lambda n: (n, n),
    kernels= [
        lambda shape: np.ones(shape, dtype= bool),
        lambda shape: np.full(shape, True)
    ],
    labels = ['ones', 'full']
)

bench_x.show()

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.