繁体   English   中英

如何使用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数组,转换为灰度图像,然后对其执行模式分析。

如果要从二进制文件中创建图像,则需要以整数形式读取,而不是浮点数。 目前,最常见的图像格式是无符号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

Numpy整数南
接受的答案状态: NaN不能存储在整数数组中。 nan 用于浮法阵列的特殊值。 有关于引入一个特殊位的讨论将允许非浮点数组存储实际上对应于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() 

    之后,您可以使用struct.unpack “解包”二进制数据

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

    numpy.fromfile ,可以读取文本和二进制文件中的数据。 您将首先使用numpy.dtype构造一个表示文件格式的数据类型,然后使用numpy.fromfile从文件中读取此类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM