Proste zaokrąglanie pływającego punktu Numpy Array wydaje się nie pracować z jakiegoś powodu.

Dostaję numpy macierzy od czytania ogromnego IMG (kształt (7352, 7472)). Ex Wartości:

>>> imarray[3500:3503, 5000:5003]
array([[ 73.33999634,  73.40000153,  73.45999908],
       [ 73.30999756,  73.37999725,  73.43000031],
       [ 73.30000305,  73.36000061,  73.41000366]], dtype=float32)

A do zaokrąglenia po prostu próbowałem użyć numpy.around () dla wartości surowej, także pisanie wartości do nowej tablicy, kopie surowej tablicy, ale z jakiegoś powodu brak wyników ..

arr=imarray
numpy.around(imarray, decimals=3, out=arr)
arr[3500,5000] #results in 73.3399963379, as well as accessing imarray

Więc jeszcze wyższa precyzja !!! Czy to z powodu tak dużej tablicy?

Muszę go zaokrąglić, aby uzyskać najczęstszą wartość (tryb) i szukam siatki, aby uniknąć więcej i więcej bibliotek ..

2
najuste 20 wrzesień 2012, 17:11

2 odpowiedzi

Najlepsza odpowiedź

Twoja tablica ma Dype float32. To jest 4-bajtowy float. Najbliższy pływak do 73.340 reprezentowany przy użyciu float32 jest mniej więcej 73.33999634:

In [62]: x = np.array([73.33999634, 73.340], dtype = np.float32)

In [63]: x
Out[63]: array([ 73.33999634,  73.33999634], dtype=float32)

Więc myślę, że np.around jest poprawnie zaokrąglenia, po prostu jest to, że twój dtype ma zbyt duży ziarnistość dookoła do numeru, którego można oczekiwać.

In [60]: y = np.around(x, decimals = 3)

In [61]: y
Out[61]: array([ 73.33999634,  73.33999634], dtype=float32)

Mając na uwadze, że jeśli dtype były np.float64:

In [64]: x = np.array([73.33999634, 73.340], dtype = np.float64)

In [65]: y = np.around(x, decimals = 3)

In [66]: y
Out[66]: array([ 73.34,  73.34])

Zauważ, że nawet jeśli drukowana reprezentacja dla y pokazuje 73,34, niekoniecznie jest to prawdą, że prawdziwa liczba 73,34 jest dokładnie reprezentowana jako float64. Reprezentacja Float64 jest prawdopodobnie tak blisko 73,34, że Numpy zdecyduje się wydrukować ją jako 73,34.

4
unutbu 20 wrzesień 2012, 13:27

Odpowiedź @unutbu jest absolutnie poprawna. Numpy zaokrąża go tak blisko numeru, ponieważ może to dać precyzję, o której prosiłeś. Jedyną rzeczą, którą muszę dodać, jest to, że możesz użyć {{ X0}} Aby zmienić sposób wyświetlania tablicy:

>>> import numpy as np
>>> x = np.array([73.33999634, 73.340], dtype = np.float32)
>>> y = np.round(x, decimals = 3)
>>> y
array([ 73.33999634,  73.33999634], dtype=float32)
>>> np.set_printoptions(precision=3)
>>> y
array([ 73.34,  73.34], dtype=float32)
2
mgilson 20 wrzesień 2012, 13:23