用numpy保存二进制文件的最安全的方法是

时间:2015-08-06 18:24:39

标签: android python arrays numpy binary

我需要使用numpy保存一些数组,稍后使用Android Java APP和另一个使用numpy的python应用程序读取。到目前为止,我一直在使用numpy.ndarray.tofile和numpy.ndarray.fromfile作为io,由于两者的简单性,我非常喜欢这两者。我写的和读取这种二进制数组的解决方案是:

def write_feature_bin_file(filepath, features_list):

if os.path.isfile(filepath):
    os.remove(filepath)

allfeatures = numpy.vstack(features_list)
header = [allfeatures.shape[0]]
try:
    header.append(allfeatures.shape[1])
except Exception as e:
    header.append(1)

if allfeatures.dtype.name == 'uint8':
    header.append(0)
else:
    header.append(5)

header = numpy.array(header, dtype=numpy.int32)

try:
    binf = open(filepath, 'a')
    header.tofile(binf)
    allfeatures.tofile(binf)
    binf.close()
except Exception as e:
    print "Unable to save file: ", filepath
    print e

return

def read_feature_bin_file(filepath):

try:
    binf = open(filepath, 'r')

    header = numpy.fromfile(f, count=3, dtype=numpy.int32)
    print header

    rows = header[0]
    cols = header[1]
    dt = header[2]


    if dt == 0:
        features = numpy.fromfile(f, dtype=numpy.uint8)
    else:
        features = numpy.fromfile(f, dtype=numpy.float32)

    features.resize(rows, cols)
    binf.close()

    return features

except Exception as e:

    print "Unable to read file: ", filepath
    print e
    return None

我在这里做的只是在输出文件中写一个小标题,包含三个整数,描述行数,列数和数据类型,可以是uint8或float32,然后追加我的其余数据到文件中。在阅读时,我读取了标题的前三个元素来检查数组属性,然后相应地读取剩余的文件。问题是:我不知道这是否安全,尤其是关于要读取此文件的系统的字节顺序。

对于我来说,确保在任何系统中正确读取此文件的最佳方法是什么?我知道numpy有" save"和#34;加载"功能,包括以.npz或.npy格式保存的功能,但我不知道如何移植它们以便在我的Android应用程序中读取。

1 个答案:

答案 0 :(得分:2)

two main options.

<强> 1。始终以相同的字节顺序保存

您可以严格定义字节序,作为文件格式规范的一部分,并相应地编写文件读取器和编写器。 例如,使用Numpy,您可以将字节序指定为dtype character code的一部分:<f4表示小端4字节浮点数(= float32)和>f4大端字节。为了始终以小端格式编写,编写例程可能包含以下内容:

if allfeatures.dtype.name == 'uint8':
    header.append(0)
else:
    allfeatures = allfeatures.astype('<f4', copy=False)
    header.append(5)

header = numpy.array(header, dtype='<i4')

<强> 2。在文件标题中指定字节顺序

这是Numpy .npy格式实现的内容(它存储ndarray.dtype.descr返回的dtype字符代码)。 {0}格式在Numpy中非常容易使用,但可能与Java应用程序不同。因此,最简单但仍然可靠的解决方案是在标头前面存储一个额外的标志。这样,在从标题中读取数组维之前,可以很容易地确定字节顺序。

或者,从当前标题中的第三个标志确定字节顺序也是有意义的,但是你必须更改.npy的标识符(零在两者中具有相同的表示形式)因为小端,所以不能使用)。它可以这样编程:

uint8