Ich bemerkte ein inkonsistentes Verhalten in numpy.dot
, wenn nan
s und Nullen beteiligt sind.Numpy.dot Fehler? Inkonsistentes NaN-Verhalten
Kann jemand einen Sinn daraus machen? Ist das ein Fehler? Ist das spezifisch für die dot
Funktion?
Ich benutze numpy v1.6.1, 64bit, läuft auf Linux (auch auf v1.6.2 getestet). Ich habe auch auf v1.8.0 auf Windows 32bit getestet (so kann ich nicht sagen, ob die Unterschiede auf die Version oder Betriebssystem oder Arch zurückzuführen sind).
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)
Fall # 4 scheint richtig in v1.6.2 und v1.8.0 zu arbeiten, aber nicht Fall # 2 ...
EDIT: @seberg wies darauf hin, das ist ein Problem blas , hier so ist die Information über die blas Installation I, indem sie from numpy.distutils.system_info import get_info; get_info('blas_opt')
gefunden:
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__)
{}
(ich persönlich weiß nicht, was daraus zu machen)
Es ist interessant für Fall 2, 'a * b' gibt das gewünschte Ergebnis, aber nicht' np.dot (a, b) '. – wflynny
Das Ergebnis von Punkt hängt von der verwendeten Bibliothek ab. Zum Beispiel, ich sehe das gleiche mit OpenBlas (aber nicht mit Atlas), so entweder dies ist nicht spezifiziert, oder ein Fehler in der Bibliothek blas. Multiplikation ist nicht wirklich verwandt ... – seberg
Hmm, probiere 'aus numpy.distutils.system_info import get_info; get_info ('blas_opt') ' – seberg