No Python, como criar uma matriz numpy de forma arbitrária preenchida com todos os True ou todos os False?
No Python, como criar uma matriz numpy de forma arbitrária preenchida com todos os True ou todos os False?
Respostas:
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 True
e False
são representados no Python como 1
e 0
, respectivamente, temos apenas que especificar que esta matriz deve ser booleana usando o dtype
parâ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 full
para 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 , full
lança automaticamente os resultados para dtype
o segundo parâmetro, para que possamos escrever:
numpy.full((2, 2), True)
a=np.ones((2,2))
seguido de a.dtype=bool
NÃO funciona.
numpy.full((2,2), True, dtype=bool)
ones
e zeros
não constroem uma matriz de números inteiros. Eles constroem uma matriz de bools diretamente.
numpy.full((2,2), True)
um equivalente?
int 1
para bool True
.
ones
e zeros
, que criam matrizes cheias de uns e zeros, respectivamente, usam um dtype
parâ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)
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 fill
você 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.zeros
ou np.ones
como as outras respostas sugerem.
Rapidamente executou um timeit para ver se há alguma diferença entre a versão np.full
e 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.empty
para inicializar um True
conjunto 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]]
>>> 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 (tamanho, valor escalar, tipo). Também existem outros argumentos que podem ser passados, para documentação sobre isso, verifique https://docs.scipy.org/doc/numpy/reference/generated/numpy.full.html
np.full
- mais de um ano atrás!