26

Ubuntu を実行しているコンピューターが最近更新され、Python のデフォルト バージョンが 2.7 に変更されたときに、この問題に気付きました。

import json
import numpy as np

json.dumps(list(np.arange(5))) # Fails, throws a "TypeError: 0 is not JSON serializable"
json.dumps(np.arange(5).tolist()) # Works 

numpy 配列の list() メソッドと tolist() メソッドに違いはありますか?

4

3 に答える 3

23

NumPy配列の要素はネイティブの整数ではなく、NUmPy独自のタイプであるため:

>>> type(np.arange(5)[0])
<type 'numpy.int64'>

カスタムを使用して、 :によって返されるタイプJSONEncoderをサポートできます。ndarrayarange

import numpy as np
import json

class NumPyArangeEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.ndarray):
            return obj.tolist() # or map(int, obj)
        return json.JSONEncoder.default(self, obj)

print(json.dumps(np.arange(5), cls=NumPyArangeEncoder))
于 2012-07-19T13:31:36.933 に答える
23

tolist()このメソッドは、numpy int32(または任意のサイズ)をに戻すように見えますint。これは、JSONが何を処理するかを認識しています。

>>> list(np.arange(5))
[0, 1, 2, 3, 4]
>>> type(list(np.arange(5)))
<type 'list'>
>>> type(list(np.arange(5))[0])
<type 'numpy.int32'>
>>> np.arange(5).tolist()
[0, 1, 2, 3, 4]
>>> type(np.arange(5).tolist())
<type 'list'>
>>> type(np.arange(5).tolist()[0])
<type 'int'>

ドキュメントが言うようにtolist()

配列を(ネストされている可能性のある)リストとして返します。

配列データのコピーを(ネストされた)Pythonリストとして返します。データ項目は、最も近い互換性のあるPythonタイプに変換されます。

最後の行がここで違いを生みます。

于 2012-07-19T13:31:37.330 に答える
1

問題は、最初の場合、intを取得できないことです。numpy.int64を取得します。シリアル化できません。

于 2012-07-19T13:31:58.860 に答える