如何使用 NumPy 读取 Python 中的二进制文件?

How to read binary files in Python using NumPy?

我知道如何使用 NumPy 的 np.fromfile() 函数读取 Python 中的二进制文件。我面临的问题是,当我这样做时,该数组的数量非常大,大约为 10^100 左右,具有随机 naninf 值。

我需要将机器学习算法应用于此数据集,但我无法使用此数据。由于 nan 值,我无法规范化数据集。

我试过 np.nan_to_num() 但这似乎不起作用。这样做之后,我的最小值和最大值分别在 3e-38 和 3e+38 之间,所以我无法对其进行归一化。

有什么方法可以缩小这些数据吗?如果没有,我该如何处理?

谢谢。

编辑:

一些上下文。我正在研究恶意软件分类问题。我的数据集由实时恶意软件二进制文件组成。它们是 .exe、.apk 等类型的文件。我的想法是将这些二进制文件存储为一个 numpy 数组,转换为灰度图像,然后对其进行模式分析。

编辑 2

Numpy integer nan
已接受的答案指出:NaN 不能存储在整数数组中。 nan 是 float 数组的特殊值 only。 有人谈论引入一个特殊位,允许非浮点数组存储实际上对应于 nan 的内容,但到目前为止(2012/10),它只是谈话。 同时,您可能需要考虑 numpy.ma 包:您可以使用特殊的 numpy.ma.masked 值来表示无效值,而不是选择像 -99999 这样的无效整数。

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()
    

    之后你可以"unpack"二进制数据使用struct.unpack

  2. 如果您使用的是np.fromfile()函数:

    numpy.fromfile, 它可以从文本和二进制文件中读取数据。你会先 使用 numpy.dtype, 然后使用 numpy.fromfile.

  3. 从文件中读取这种类型

如果你想从一个二进制文件中生成一个图像,你需要将它作为整数读入,而不是浮点数。目前,最常见的图像格式是无符号 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 "looks" 的前 10,000 个字节: