Como criar uma matriz numpy de todos os True ou All False?


Respostas:


281

o numpy já permite a criação de matrizes de todos os zeros ou todos com muita facilidade:

por exemplo numpy.ones((2, 2))ounumpy.zeros((2, 2))

Como Truee Falsesão representados no Python como 1e 0, respectivamente, temos apenas que especificar que esta matriz deve ser booleana usando o dtypeparâmetro opcional e pronto.

numpy.ones((2, 2), dtype=bool)

retorna:

array([[ True,  True],
       [ True,  True]], dtype=bool)

ATUALIZAÇÃO: 30 de outubro de 2013

Desde a versão 1.8 do numpy , podemos usar fullpara obter o mesmo resultado com sintaxe que mostra mais claramente nossa intenção (como fmonegaglia aponta):

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

ATUALIZAÇÃO: 16 de janeiro de 2017

Como pelo menos a versão numpy 1.12 , fulllança automaticamente os resultados para dtypeo segundo parâmetro, para que possamos escrever:

numpy.full((2, 2), True)


37
Você respondeu sua própria pergunta no mesmo minuto em que a pergunta foi postada?
— M4rtini 17/01

26
O @ M4rtini SO permite que você publique uma pergunta e uma resposta à pergunta simultaneamente.
— Mick MacCallum

1
dtype = int matriz inicializada não pode ser usada para a seleção de elementos da matriz.
— Jichao

1
Isso funciona. No entanto, tenha cuidado porque, como diz o @Jichao, a=np.ones((2,2))seguido de a.dtype=boolNÃO funciona.
— medley56

8
Agora um meme famoso: devhumor.com/media/…
— WLGfx 2/17/17

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

12
+1 Acho que essa deve ser a resposta aceita. Parece mais natural preencher uma matriz com bools do que preenchê-la com números para convertê-los em bools.
— Zelphir Kaltstahl

5
As respostas onese zerosnão constroem uma matriz de números inteiros. Eles constroem uma matriz de bools diretamente.
— User2357112 suporta Monica

1
É numpy.full((2,2), True)um equivalente?
— Pavel

Está no numpy 1.12+. Eu não me lembro se ela se aplica a versões anteriores quer
— fmonegaglia

Certamente o dtype é armazenado separadamente dos dados em si, quando possível? Eu não posso imaginar numpy fazer qualquer trabalho pesado para converter int 1para bool True.
— precisa

30

onese zeros, que criam matrizes cheias de uns e zeros, respectivamente, usam um dtypeparâmetro opcional :

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

Se não precisar ser gravável, você poderá criar uma matriz com 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)

Se você precisar gravá-lo, também poderá criar uma matriz vazia e fillvocê mesmo:

>>> arr = np.empty((2, 5), dtype=bool)
>>> arr.fill(1)
>>> arr
array([[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True]], dtype=bool)

Essas abordagens são apenas sugestões alternativas. Em geral, você deve ficar com np.full, np.zerosou np.onescomo as outras respostas sugerem.


3

Rapidamente executou um timeit para ver se há alguma diferença entre a versão np.fulle np.ones.

Resposta: Não

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

Resultado:

np.ones: 0.38416870904620737s
np.full: 0.38430388597771525s


IMPORTANTE

Em relação ao post sobre np.empty(e não posso comentar, pois minha reputação é muito baixa):

NÃO FAÇA ISSO. NÃO USE np.emptypara inicializar um Trueconjunto completo

Como a matriz está vazia, a memória não é gravada e não há garantia, quais serão seus valores, por exemplo

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.