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