NumPyのnp.fromfile()
関数を使用してPythonでバイナリファイルを読み取る方法を知っています。私が直面している問題は、そうすると、配列に非常に多くのランダムなnan
およびinf
値を使用した10 ^ 100程度のオーダー。
このデータセットに機械学習アルゴリズムを適用する必要がありますが、このデータを操作できません。 nan
値のため、データセットを正規化できません。
np.nan_to_num()
を試しましたが、うまくいかないようです。そうした後、私の最小値と最大値はそれぞれ3e-38と3e + 38の範囲であるため、正規化できませんでした。
このデータを縮小する方法はありますか?そうでない場合、私はこれにどのように対処する必要がありますか?
ありがとうございました。
編集:
いくつかのコンテキスト。私はマルウェア分類の問題に取り組んでいます。私のデータセットは、ライブマルウェアバイナリで構成されています。これらは、.exe、.apkなどのタイプのファイルです。私の考えは、これらのバイナリをnumpy配列として格納し、グレースケールイメージに変換してから、パターン分析を実行することです。
バイナリファイルから画像を作成する場合は、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バイトが「どのように見えるか」です。
編集2
この回答を参照してください: https://stackoverflow.com/a/11548224/6633975
NaN
は整数配列に格納できません。これは、現時点ではpandasの既知の制限です。NumPyのNA値(RのNAと同様)が進展するのを待っていましたが、少なくとも6か月はかかりますNumPyがこれらの機能を取得する1年前には、次のように思われます。
ソース: http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na
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
バイナリファイルを読み取るには:
次のようなバイナリファイルの内容を読み取ります。
_with open(fileName, mode='rb') as file: # b is important -> binary
fileContent = file.read()
_
その後、 struct.unpack を使用してバイナリデータを「解凍」できます。
np.fromfile()
関数を使用している場合:
_numpy.fromfile
_ 、テキストファイルとバイナリファイルの両方からデータを読み取ることができます。まず、 _numpy.dtype
_ を使用してファイル形式を表すデータ型を作成し、次に_numpy.fromfile
_を使用してファイルからこの型を読み取ります。