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:
>>> a = numpy.empty((3,3,))
>>> a[:] = numpy.nan
>>> a
array([[ NaN, NaN, NaN],
[ NaN, NaN, NaN],
[ NaN, NaN, NaN]])
Eu cronometrei as alternativas a[:] = numpy.nan
aqui e a.fill(numpy.nan)
como postadas por Blaenk:
$ python -mtimeit "import numpy as np; a = np.empty((100,100));" "a.fill(np.nan)"
10000 loops, best of 3: 54.3 usec per loop
$ python -mtimeit "import numpy as np; a = np.empty((100,100));" "a[:] = np.nan"
10000 loops, best of 3: 88.8 usec per loop
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)
retornando None
.
np.nan
dá errado quando convertido em int.