2015-11-12 8 views
8

Also, in numpy 1.8.2 (mit Python 2.7.6) scheint ein Problem in Array-Division. Bei der In-Place-Division eines ausreichend großen Arrays (mindestens 8192 Elemente, mehr als eine Dimension, Datentyp ist irrelevant) mit einem Teil von sich selbst ist das Verhalten für verschiedene Notationen inkonsistent.Unerwartetes Verhalten in numpy, beim Teilen von Arrays

import numpy as np 
arr = np.random.rand(2, 5000) 
arr_copy = arr.copy() 
arr_copy = arr_copy/arr_copy[0] 
arr /= arr[0] 
print np.sum(arr != arr_copy), arr.size - np.sum(np.isclose(arr, arr_copy)) 

Der Ausgang 0 sein soll, da die beiden Divisionen konsequent sein sollte, aber es ist 1808. Ein Bug ist das? Tritt es auch in anderen numpigen Versionen vor?

+2

Ein Kollege wies darauf hin, dass dieses Verhalten darauf zurückzuführen sein könnte, dass arr [0] nur eine Ansicht von arr ist und daher während der In-Place-Operation verändert wurde. – Dschoni

Antwort

7

Es ist nicht wirklich ein Fehler, als mit Puffergröße zu tun, wie Sie in der Frage vorschlagen. Einstellen der Puffergröße größer wird das Problem loszuwerden (jetzt ...):

>>> np.setbufsize(8192*4) # sets new buffer size, returns current size 
8192 
>>> # same set up as in the question 
>>> np.sum(arr != arr_copy), arr.size - np.sum(np.isclose(arr, arr_copy)) 
(0, 0) 

Und wie Sie im Kommentar angeben, arr /= arr[0] die Inplace-Abteilung ist, wo diese ursprünglich schief geht. Nur die ersten 8192 Elemente von arr werden gepuffert mit arr[0], was einfach ein Blick auf die erste Reihe von arr ist.

Das bedeutet, dass alle 5000 Werte in der ersten Zeile korrekt von einander geteilt werden, und die zweite Zeile wird auch bis Index 3192 korrekt sein. Als nächstes werden die restlichen 1808 Werte in den Puffer für die Inplace Division aber eingefügt Die erste Zeile hat sich bereits geändert: arr[0] ist jetzt einfach eine Ansicht einer Reihe von Einsen, so dass die Werte in den letzten Spalten nur durch eins geteilt werden.