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.