Як створити масивний масив усіх True або all False?


Відповіді:


283

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)


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відповіді не будують масив цілих чисел. Вони будують масив булів безпосередньо.
user2357112 підтримує Моніку

1
Є numpy.full((2,2), True)еквівалент?
Павло

Це в ряді 1,12+. Я не пам'ятаю, чи стосується вона і колишніх версій
fmonegaglia

Надмірний тип зберігається окремо від самих даних, коли це можливо? Я не можу собі уявити , 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

Швидко пробіг час, щоб побачити, чи є різниці між версією 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.