2

データ型 ">u2" (ビッグエンディアン、符号なし、2 バイト/16 ビット) の numpy 配列を出力する外部ライブラリを使用しています。私の場合、10 ビットのみが有効です (出力は、実際にlittle-endianを出力するハードウェア デバイスからのものです)。例えば:

65283bin(65283)=0b1111111100000011直接の python 出力に対応する最大値、または00001111111111リトルエンディアンの場合。

0-65283ライブラリからの範囲出力を0-1023、10 ビット ハードウェア機能から意味のある範囲にマップしたいと思います。どうすればいいですか?

私は次のことを試しました:

>>>import numpy as np

>>>arr=np.array([65283, 6528, 652, 65, 6], dtype=">u2")
>>>print arr/64  # same as arr/2**6 and arr >> 6
[1020  102   10    1    0]
>>>print arr.byteswap()
[ 1023 32793 35842 16640  1536]

しかし、これでは望ましい結果が得られません。私が見つけたのは、bin()関数がビッグエンディアン形式で出力されることです (この numpy 配列の場合) が、パディングされたゼロは省略されています。たとえば、65283 ではすべての 16 ビットが表されますが、bin(6528)=0b1100110000000(中央のゼロが 3 つ欠落しています)。

これを修正する (そして 10 ビットのリトル エンディアン数を返す) には、バイナリ形式の 6528 を取得し、真ん中に 3 つのゼロを追加して、バイト スワップを実行します。しかし、1) これは非常に面倒 (要素ごとに行う) であり、2) ゼロパディングは一貫していません (たとえば、652 にはさらに 6 つのゼロが必要です)。

これを行う組み込みの方法はありますか?structモジュール (w/ packand or ) が役立つように見えますが、unpack今のところギリシャ語です。どんな助けでも大歓迎です!

編集

私は犯人を見つけたと信じています。上記の私の例 (65238 のカメラ/ライブラリから実際の値を取得し、明らかに右端の桁を削除した半任意の追加値を想定) は起こりません! たとえば、6528 では最下位バイト ( 00011001**1**0000000) に 1 が必要ですが、それは決して起こりません (10 ビットのみが有効です)。

さらに調べてみるarr.byteswap()と、コード内の単純なもの (arr正当な値がある場所) が機能します。例えば:

>>>arr=np.array([12288, 13312, 12800, 12032, 13312, 13824, 65283, 0, 7936], dtype=">u2")
>>>arr.byteswap()
array([  48,   52,   50,   47,   52,   54, 1023,    0,   31], dtype=uint16)

私は自分のコードで実際にそれを試したことはありませんでした。この作成された例でのみです。混乱させて申し訳ありません。しかし、うまくいけば、他の誰かがこの問題に遭遇するのを助けるかもしれません (特に Basler カメラを使用している場合)。

4

1 に答える 1

0
import struct
struct.pack('<H',val)

または、さらに良い:

>>> arr.byteswap().newbyteorder()
array([65283,  6528,   652,    65,     6], dtype=uint16)
>>> arr.byteswap().newbyteorder().tostring()
'\x03\xff\x80\x19\x8c\x02A\x00\x06\x00'

ドキュメント

于 2012-05-09T21:48:24.533 に答える