我知道如何使用NumPy的np.fromfile()
函数在Python中读取二进制文件。我遇到的问题是,当我这样做时,数组的数量非常大,大约为10 ^ 100左右,具有随机nan
和inf
值。
我需要将机器学习算法应用于此数据集,我无法使用此数据。由于nan
值,我无法规范化数据集。
我已经尝试np.nan_to_num()
,但这似乎不起作用。这样做后,我的最小值和最大值分别为3e-38和3e + 38,所以我无法将其标准化。
有没有办法缩小这些数据?如果没有,我该如何处理?
谢谢。
修改
一些背景。我正在处理恶意软件分类问题。我的数据集由实时恶意软件二进制文件组成。它们是.exe,.apk等类型的文件。我的想法是将这些二进制文件存储为numpy数组,转换为灰度图像,然后对其执行模式分析。
答案 0 :(得分:9)
如果要从二进制文件中创建图像,则需要以整数形式读取,而不是浮点数。目前,最常见的图像格式是无符号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个字节看起来像:
答案 1 :(得分:0)
编辑2
请参阅此答案:https://stackoverflow.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
是浮动数组仅的特殊值。
有关于引入一个特殊位的讨论会允许非浮点数组存储实际上对应于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
从文件中读取此类型。