2015-11-12 19 views
8

Quindi, in numpy 1.8.2 (con python 2.7.6) sembra esserci un problema nella divisione dell'array. Quando si esegue la divisione sul posto di un array sufficientemente grande (almeno 8192 elementi, più di una dimensione, il tipo di dati è irrilevante) con una parte di sé, il comportamento è incoerente per diverse notazioni.Comportamento imprevisto in numpy, quando si dividono gli array

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)) 

L'uscita è prevista per 0, come le due divisioni dovrebbero essere coerenti, ma è 1808. Si tratta di un bug? Accade anche in altre versioni di Numpy?

+2

Un collega ha sottolineato, che questo comportamento potrebbe essere dovuto al motivo, che arr [0] è solo una vista di arr e quindi modificato durante l'operazione sul posto. – Dschoni

risposta

7

In realtà non è un bug, quanto lo è la dimensione del buffer come suggerito nella domanda. Impostazione del buffer di dimensioni maggiori si libera del problema (per ora ...):

>>> 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) 

E come si affermi nel commento, la divisione inplace arr /= arr[0] è dove questo va in origine sbagliato. Solo i primi 8192 elementi di arr vengono memorizzati nel buffer con arr[0] semplicemente visualizzando la prima riga di arr.

Ciò significa che tutti i 5000 valori nella prima riga verranno divisi correttamente da soli e la seconda riga sarà corretta fino all'indice 3192. Successivamente i restanti valori 1808 vengono inseriti nel buffer per la divisione inplace ma la prima riga è già stata cambiata: arr[0] ora è semplicemente una vista di una riga di una, quindi i valori nelle ultime colonne saranno semplicemente divisi per uno.

Problemi correlati