如何使用 NumPy 在 Python 中读取二进制文件?
Posted
技术标签:
【中文标题】如何使用 NumPy 在 Python 中读取二进制文件?【英文标题】:How to read binary files in Python using NumPy? 【发布时间】:2017-02-07 06:58:25 【问题描述】:我知道如何使用 NumPy 的 np.fromfile()
函数在 Python 中读取二进制文件。我面临的问题是,当我这样做时,数组具有非常大的数量,大约为 10^100 左右,具有随机的 nan
和 inf
值。
我需要将机器学习算法应用于此数据集,但我无法处理此数据。由于nan
值,我无法对数据集进行规范化。
我试过np.nan_to_num()
,但这似乎不起作用。这样做之后,我的最小值和最大值分别在 3e-38 和 3e+38 范围内,所以我无法对其进行归一化。
有没有办法缩小这些数据?如果没有,我该如何处理?
谢谢。
编辑:
一些上下文。我正在处理恶意软件分类问题。我的数据集由实时恶意软件二进制文件组成。它们是 .exe、.apk 等类型的文件。我的想法是将这些二进制文件存储为 numpy 数组,转换为灰度图像,然后对其执行模式分析。
【问题讨论】:
尝试pandas
读取文件
@maxymoo 可以pandas
读取二进制文件吗?
“二进制文件”是什么意思?您可以在帖子中添加文件示例吗?
您希望得到什么样的数字?您是否尝试过指定dtype
参数?它使用默认的float
。
好的,数值不代表实数;难怪浮动版本看起来很奇怪。尝试使用像np.uint8
这样的数据类型,它将每个字节表示为 0 到 255 之间的数字。
【参考方案1】:
如果要从二进制文件中生成图像,则需要将其作为整数而不是浮点数读取。目前,最常见的图像格式是无符号 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 个字节“看起来”是这样的:
【讨论】:
这成功了!我将二进制文件作为浮点数读取,这导致了错误。我把它读为 uint8 ,它工作得很好。谢谢【参考方案2】:编辑 2
参考这个答案:https://***.com/a/11548224/6633975
它指出:NaN
不能存储在整数数组中。这是一个已知的
目前熊猫的限制;我一直在等待进展
用 NumPy 中的 NA 值制作(类似于 R 中的 NA),但它会
在 NumPy 获得这些功能之前至少需要 6 个月到一年,它
看来:
来源: http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na
Numpy integer nan
接受的答案状态:NaN
不能存储在整数数组中。 nan
是浮点数组的特殊值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
读取二进制文件:
读取二进制文件内容如下:
with open(fileName, mode='rb') as file: # b is important -> binary
fileContent = file.read()
之后你可以使用struct.unpack“解压”二进制数据
如果你使用np.fromfile()
函数:
numpy.fromfile
,
它可以从文本和二进制文件中读取数据。你会先
构造一个数据类型,它代表你的文件格式,使用
numpy.dtype
,
然后使用numpy.fromfile
从文件中读取此类型。
【讨论】:
以上是关于如何使用 NumPy 在 Python 中读取二进制文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 numpy 二维数组作为一种可以用 C++ 读取的二进制格式存储到磁盘上