2

でこぼこのバージョン: 1.6.2

配列の個々のスカラーがdtypeで設定されたエンディアンを維持しない理由を誰かが説明できますか? 正しいエンディアンで出力するにはどうすればよいですか?

>>> numpy_type1 = numpy.uint32
>>> numpy_type2 = numpy.dtype(numpy_type1).newbyteorder('>')
>>> hexdump(numpy.array([100000000], dtype = numpy_type1).tostring())
'00e1f505' # OKAY (endianness of host platform)
>>> hexdump(numpy.array([100000000], dtype = numpy_type2).tostring())
'05f5e100' # OKAY (byte swap is visible)
>>> hexdump(numpy.array([100000000], dtype = numpy_type1)[0].tostring())
'00e1f505' # OKAY (endianness of host platform)
>>> hexdump(numpy.array([100000000], dtype = numpy_type2)[0].tostring())
'00e1f505' # FAIL (no byte swapping seen)
>>> hexdump(numpy_type1(100000000).tostring())
'00e1f505' # OKAY (endianness of host platform)
>>> hexdump(numpy_type2.type(100000000).tostring())
'00e1f505' # FAIL (no byte swapping seen)

上記の例では、numpy 配列に対して tostring が呼び出されたときにバイト スワッピングが適切に実行されますが、配列のスカラー要素に対しては正しく実行されないことに注意してください。

簡単に言えば、dtype から値をインスタンス化し、正しいエンディアンでバイナリ文字列を取得する方法が必要なだけです。Numpy がサポートしている float16、float128、またはその他のエキゾチックな数値型をサポートしていないため、Python 構造体を使用できません。バイトスワッピングを手動で行いたくありません。

私はこの作品を見てみたいです:

>>> hexdump(numpy_type2.type(100000000).tostring())
'05f5e100' # OKAY (byte swapping seen)
4

1 に答える 1

1

struct単一の値の場合は、パッケージを使用することもできます。スカラーは、単純にするために numpy (常にシステム) にエンディアンを持たないだけです。ただし、エンディアンを保持する 0-d 配列を使用することもできます。しかし、ほとんどの結果では、numpy は 0-d 配列をスカラーに変換します。これは通常、必要なものであるためです。

使えないとおっしゃっていたので、多少醜くてもstruct使えます。np.array(scalar, dtype=original.dtype).tostring()

于 2012-12-06T10:18:29.207 に答える