Ho notato un comportamento incoerente in numpy.dot
quando sono coinvolti gli zeri nan
e zeri.Numpy.dot bug? Comportamento NaN incoerente
Qualcuno può dare un senso a questo? è un insetto? È specifico per la funzione dot
?
Sto usando numpy v1.6.1, 64 bit, in esecuzione su linux (anche testato su v1.6.2). Ho anche provato su v1.8.0 su Windows 32bit (quindi non posso dire se le differenze sono dovute alla versione o al sistema operativo o all'arco).
from numpy import *
0*nan, nan*0
=> (nan, nan) # makes sense
#1
a = array([[0]])
b = array([[nan]])
dot(a, b)
=> array([[ nan]]) # OK
#2 -- adding a value to b. the first value in the result is
# not expected to be affected.
a = array([[0]])
b = array([[nan, 1]])
dot(a, b)
=> array([[ 0., 0.]]) # EXPECTED : array([[ nan, 0.]])
# (also happens in 1.6.2 and 1.8.0)
# Also, as @Bill noted, a*b works as expected, but not dot(a,b)
#3 -- changing a from 0 to 1, the first value in the result is
# not expected to be affected.
a = array([[1]])
b = array([[nan, 1]])
dot(a, b)
=> array([[ nan, 1.]]) # OK
#4 -- changing shape of a, changes nan in result
a = array([[0],[0]])
b = array([[ nan, 1.]])
dot(a, b)
=> array([[ 0., 0.], [ 0., 0.]]) # EXPECTED : array([[ nan, 0.], [ nan, 0.]])
# (works as expected in 1.6.2 and 1.8.0)
Caso # 4 sembra funzionare correttamente in v1.6.2 e v1.8.0, ma non Caso # 2 ...
EDIT: @seberg ha sottolineato che questo è un problema Blas ecco le informazioni circa l'installazione Blas ho trovato eseguendo from numpy.distutils.system_info import get_info; get_info('blas_opt')
:
1.6.1 linux 64bit
/usr/lib/python2.7/dist-packages/numpy/distutils/system_info.py:1423: UserWarning:
Atlas (http://math-atlas.sourceforge.net/) libraries not found.
Directories to search for the libraries can be specified in the
numpy/distutils/site.cfg file (section [atlas]) or by setting
the ATLAS environment variable.
warnings.warn(AtlasNotFoundError.__doc__)
{'libraries': ['blas'], 'library_dirs': ['/usr/lib'], 'language': 'f77', 'define_macros': [('NO_ATLAS_INFO', 1)]}
1.8.0 windows 32bit (anaconda)
c:\Anaconda\Lib\site-packages\numpy\distutils\system_info.py:1534: UserWarning:
Blas (http://www.netlib.org/blas/) sources not found.
Directories to search for the sources can be specified in the
numpy/distutils/site.cfg file (section [blas_src]) or by setting
the BLAS_SRC environment variable.
warnings.warn(BlasSrcNotFoundError.__doc__)
{}
(io personalmente non so che cosa fare di esso)
È interessante per il caso 2, 'a * b' fornisce il risultato desiderato ma non' np.dot (a, b) '. – wflynny
Il risultato del punto dipende dalla libreria blas in uso. Per esempio, sto vedendo lo stesso con openblas (ma non con atlante), quindi o questo non è specificato, o un bug nella libreria blas. La moltiplicazione non è correlata in realtà ... – seberg
Hmm, prova 'da numpy.distutils.system_info import get_info; get_info ('blas_opt') ' – seberg