0

空白スペースで区切られた数字の列を持つ大きなデータ ファイルがあります。それらをnumpy配列として読みたいと思います。

ファイルnumpy.loadtxt(filename)を読み込んでいました。問題は、コードがこの 19 桁の文字列を数値に変換しようとしたときに発生しました。最初の 17 桁しか正確に表現できないようです。

簡単な例を次に示します。

from StringIO import StringIO
import numpy as np 

#use this s string to mimick the input txt file
s = StringIO('1237657220412736271 39843.3948')
arr = np.loadtxt(s)
print int(arr[0])

あなたがそれを実行すると、あなたは得る

1237657220412736256

から持っているデータの種類を指定できることは知っていますがnp.loadtxt()、最初の数値を長整数として読み取るように指定しても、19 桁の数値の文字列を正確に表すことはできません。

これを行うより良い方法はありますか?

4

3 に答える 3

2

最初の数字を長整数として読み取るように指定したのに

2番目の値がfloatであることを考えると、単一のタイプでそれをどのように行ったかはわかりません。しかし、それを取り除けば、最初の数値をより長い整数型として読み取ることができ、すべてが正常に機能します。

>>> s = cStringIO.StringIO('1237657220412736271 39843')
>>> arr = np.loadtxt(s, dtype='i8')
>>> int(arr[0])
1237657220412736271

同様に、元の文字列のように異種の形式を指定して('i8', 'f8')フィードすると、元の文字列で正常に機能します。

だから、私の疑いは、あなたがあなたがしたと思うことをしなかったということです、そしてそれがそれがうまくいかなかった理由です。

もう1つの可能性は、「長整数」とは文字通り「C長」を意味し、32ビットプラットフォームまたは64ビットWindowsを使用している場合です。これは、32ビットの数値を意味します。しかし、私はnumpyそのタイプを再び長い間取り除いたと確信しています。そうでなかった場合、それはあなたが見ているものとは異なる問題をあなたに与えるでしょう。

于 2012-12-12T02:40:30.390 に答える
1

を呼び出すとnp.loadtxt、ファイルのすべての要素が float であると想定されます。これを整数に戻すと、精度の問題が発生します。で構造化配列 read を指定できますnp.loadtxt。これにより、さまざまなデータ型のさまざまな列を読み取ることができます。

arr = np.loadtxt(s, dtype={'names': ('ints', 'floats'),
                                     'formats': ('i8', 'f8')})

ここでの違いは、特定のデータ型の 2D 配列ではなく構造化配列を取得することです。別の方法で (名前またはインデックス番号のいずれかで) インデックスを付ける必要がありますが、int が正しく読み取られていることを確認できます。

>>> int(arr[0][0])
1237657220412736271
>>> int(arr['ints'][0])
1237657220412736271

(この構文は、特定の文字列では失敗することに注意してください。これsは、1 行しかなく、0 次元の配列が得られるためです。ただし、複数行のファイルでは機能します。)

もう 1 つの方法はnp.loadtxt、各列に 1 つずつ、 2 つのロードを実行することです。

arr1 = np.loadtxt(s, dtype='i8', usecols=(0,))
arr2 = np.loadtxt(s, dtype='f8', usecols=(1,))
于 2012-12-12T02:49:41.933 に答える
0

私はこれを試しました:

>>> s = '1237657220412736271 39843.3948'
>>> a = s.split()
>>> int(a[0])
1237657220412736271

残念ながら、numpyが19桁の数値を浮動小数点数として読み取る場合、すべての有効数字を取得するのに十分な精度がないため、丸め誤差が発生します。数値が常に収まることがわかっているintが、大きすぎて正確にdoubleで表すことができない場合は、その制限を回避するために、上記のようなことを行う必要があります。

于 2012-12-12T02:42:42.867 に答える