Eu tenho o seguinte código:
r = numpy.zeros(shape = (width, height, 9))
Ele cria uma width x height x 9
matriz preenchida com zeros. Em vez disso, eu gostaria de saber se existe uma função ou maneira de inicializá-los, em vez de NaN
s de uma maneira fácil.
np.nan
dá errado quando convertido em int.Respostas:
Você raramente precisa de loops para operações de vetor em numpy. Você pode criar uma matriz não inicializada e atribuir a todas as entradas de uma vez:
Eu cronometrei as alternativas
a[:] = numpy.nan
aqui ea.fill(numpy.nan)
como postadas por Blaenk:Os tempos mostram uma preferência por
ndarray.fill(..)
como a alternativa mais rápida. OTOH, eu gosto da implementação de conveniência do numpy, onde você pode atribuir valores a fatias inteiras no momento, a intenção do código é muito clara.Observe que
ndarray.fill
realiza sua operação no local,numpy.empty((3,3,)).fill(numpy.nan)
retornandoNone
.fonte
a = numpy.empty((3, 3,)) * numpy.nan
. O tempo foi mais rápido do que ofill
mais lento que o método de atribuição, mas é um delineador !!.fill()
método, mas a diferença de velocidade reduz a praticamente nada, à medida que as matrizes ficam maiores.np.empty([2, 5])
cria uma matriz,fill()
modifica-a no local, mas não retorna uma cópia ou referência. Se você deseja chamarnp.empty(2, 5)
por um nome ("atribuir é a uma variável"), é necessário fazê-lo antes de executar as operações no local. A mesma coisa acontece se você fizer[1, 2, 3].insert(1, 4)
. A lista é criada e um 4 é inserido, mas é impossível obter uma referência à lista (e, portanto, pode-se supor que ela tenha sido coletada de lixo). Em dados imutáveis, como seqüências de caracteres, uma cópia é retornada, porque você não pode operar no local. Os pandas podem fazer as duas coisas.Outra opção é usar
numpy.full
, uma opção disponível no NumPy 1.8+Isso é bastante flexível e você pode preenchê-lo com qualquer outro número que desejar.
fonte
full
significa.np.empy((x,y))*np.nan
é um bom vice-campeão (e compatibilidade para versões antigas do numpy).fill
python -mtimeit "import numpy as np; a = np.empty((100,100));" "a.fill(np.nan)" 100000 loops, best of 3: 13.3 usec per loop python -mtimeit "import numpy as np; a = np.full((100,100), np.nan);" 100000 loops, best of 3: 18.5 usec per loop
python -mtimeit "import numpy as np; a = np.empty((1000,1000)); a.fill(np.nan)" 1000 loops, best of 3: 381 usec per loop $ python -mtimeit "import numpy as np; a = np.full((1000,1000), np.nan);" 1000 loops, best of 3: 383 usec per loop
Comparei as alternativas sugeridas para velocidade e descobri que, para vetores / matrizes grandes o suficiente para preencher, todas as alternativas, exceto
val * ones
earray(n * [val])
são igualmente rápidas.Código para reproduzir o gráfico:
fonte
numpy.full(n, val)
é mais lento do quea = numpy.empty(n) .. a.fill(val)
uma vez que faz a mesma coisa internamenteVocê é familiar com
numpy.nan
?Você pode criar seu próprio método, como:
Então
produziria
Encontrei esse código em um thread de lista de discussão .
fonte
Você sempre pode usar a multiplicação se não se lembrar imediatamente dos métodos
.empty
ou.full
:Claro que também funciona com qualquer outro valor numérico:
Mas a resposta aceita do @ u0b34a0f6ae é 3x mais rápida (ciclos da CPU, não ciclos do cérebro para lembrar a sintaxe numpy;):
fonte
Outra alternativa é
numpy.broadcast_to(val,n)
que retorna em tempo constante, independentemente do tamanho, e também é a mais eficiente em memória (retorna uma visão do elemento repetido). A ressalva é que o valor retornado é somente leitura.Abaixo está uma comparação dos desempenhos de todos os outros métodos que foram propostos usando o mesmo benchmark da resposta de Nico Schlömer .
fonte
Como dito, numpy.empty () é o caminho a percorrer. No entanto, para objetos, fill () pode não fazer exatamente o que você pensa que faz:
Uma maneira de contornar isso pode ser, por exemplo:
fonte
Ainda outra possibilidade ainda não mencionada aqui é usar o bloco NumPy:
Também dá
Eu não sei sobre comparação de velocidade.
fonte