web-dev-qa-db-ja.com

NumPyを使用してPythonでバイナリファイルを読み取る方法は?

NumPyのnp.fromfile()関数を使用してPythonでバイナリファイルを読み取る方法を知っています。私が直面している問題は、そうすると、配列に非常に多くのランダムなnanおよびinf値を使用した10 ^ 100程度のオーダー。

このデータセットに機械学習アルゴリズムを適用する必要がありますが、このデータを操作できません。 nan値のため、データセットを正規化できません。

np.nan_to_num()を試しましたが、うまくいかないようです。そうした後、私の最小値と最大値はそれぞれ3e-38と3e + 38の範囲であるため、正規化できませんでした。

このデータを縮小する方法はありますか?そうでない場合、私はこれにどのように対処する必要がありますか?

ありがとうございました。

編集:

いくつかのコンテキスト。私はマルウェア分類の問題に取り組んでいます。私のデータセットは、ライブマルウェアバイナリで構成されています。これらは、.exe、.apkなどのタイプのファイルです。私の考えは、これらのバイナリをnumpy配列として格納し、グレースケールイメージに変換してから、パターン分析を実行することです。

5
Suyash Shetty

バイナリファイルから画像を作成する場合は、floatではなく整数として読み込む必要があります。現在、画像の最も一般的な形式は符号なし8ビット整数です。

例として、/ bin/bashの最初の10,000バイトから画像を作成しましょう。

>>> import numpy as np
>>> import cv2
>>> xbash = np.fromfile('/bin/bash', dtype='uint8')
>>> xbash.shape
(1086744,)
>>> cv2.imwrite('bash1.png', xbash[:10000].reshape(100,100))

上記では、OpenCVライブラリを使用して整数をPNGファイルに書き込みました。他のいくつかのイメージングライブラリのいずれかを使用できた可能性があります。

これは、bashの最初の10,000バイトが「どのように見えるか」です。

enter image description here

13
John1024

編集2

Numpy integer nan
受け入れられた回答の状態:NaNは整数配列に格納できません。 nanは、float配列の特別な値ですonly。非フロート配列が実際にはnanに対応するものを格納できるようにする特別なビットを導入することについての話がありますが、これまでのところ(2012/10)、それは話だけです。それまでの間、 _numpy.ma_ パッケージを検討することをお勧めします。-99999のような無効な整数を選択する代わりに、特別な_numpy.ma.masked_値を使用して無効な値を表すことができます。 。

_a = np.ma.array([1,2,3,4,5], dtype=int)
a[1] = np.ma.masked
masked_array(data = [1 -- 3 4 5],
             mask = [False  True False False False],
       fill_value = 999999)
_

編集1

バイナリファイルを読み取るには:

  1. 次のようなバイナリファイルの内容を読み取ります。

    _with open(fileName, mode='rb') as file: # b is important -> binary
        fileContent = file.read()
    _

    その後、 struct.unpack を使用してバイナリデータを「解凍」できます。

  2. np.fromfile()関数を使用している場合:

    _numpy.fromfile_ 、テキストファイルとバイナリファイルの両方からデータを読み取ることができます。まず、 _numpy.dtype_ を使用してファイル形式を表すデータ型を作成し、次に_numpy.fromfile_を使用してファイルからこの型を読み取ります。

0
Sayali Sonawane