2017-08-16 6 views
1

私はこれで完全に困惑しています。array([ 0.4, -9]):以下numpy.arrayはdtypeが指定されていても指定されていなくても奇妙な動作をします

import numpy as np 

a = np.array([4, -9]) 
a[0] = 0.4 
a 

I 予想出力から

。しかし、それは私を与える

しかし、私はdtype

fから
a = np.array([4, -9], 'f') 
a[0] = 0.4 
a 

を変更したときにそれは私にnumpy.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)ためarray([ 0.40000001, -9. ], dtype=float32)

文書のうち予想プットを与える氏は述べています:

DTYPE:データ型、オプション 配列の目的のデータ型。指定されていない場合、型はシーケンス内のオブジェクトを保持するために必要な最小型として決定されます。この引数は、配列を 'アップキャスト'するためにのみ使用できます。ダウンキャストの場合は、.astype(t)メソッドを使用します。

私はそれが唯一の0.4integer一部を認識し、したがって、私に0を与えたfloatと配列のインデックスを作成したときに、それはintegersなどに値を初期化し、配列を初期化するとき。これは私がそれを理解する方法です。これは正しいです?。しかし、私はまだこの動作に驚いています。

質問:ここでは正確に何が起こっていますか?

答えて

1

問題は、あなたの配列がdtype=np.int64であるということである。

In [141]: a = np.array([4, -9]) 

In [142]: a.dtype 
Out[142]: dtype('int64') 

これは、割り当てが行われる前に、あなただけの店の整数、および任意の山車が切り捨てられることを意味します。浮動小数点数は、メモリ内の正確な表現(のみおおよそのものを持っていないとして、array([ 0.40000001, -9. ]0.4の問題については

In [143]: a = np.array([4, -9], dtype=object) 

In [144]: a[0] = 0.4 

In [145]: a 
Out[145]: array([0.4, -9], dtype=object) 

:あなたが一緒に山車とint型を保存したい場合は、dtype=object最初に指定する必要があります)、あなたが見る不正確さを説明します。

+0

優れています。これは問題を解決します。明らかに、私は学ぶべきことがたくさんある。 – minibuffer

+0

浮動小数点と整数の両方を保存するために 'dtype = object'を使う考え方は嫌いです。必要に応じて文字列や数値を混ぜることもできますし、リストのようなものを保持するのにも適しています。しかし、純粋に数値データの場合は、数字のdtypeを使用する方が良いでしょう。 – hpaulj

+0

@hpaulj利用可能です。数値以外のタイプの場合は、ベクトル化のメリットをすべて失います。 –

関連する問題