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 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)
a=np.ones((2,2))seguido de a.dtype=boolNÃO funciona.
numpy.full((2,2), True, dtype=bool)
onese zerosnão constroem uma matriz de números inteiros. Eles constroem uma matriz de bools diretamente.
numpy.full((2,2), True)um equivalente?
int 1para bool True.
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)
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.
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]]
>>> 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!