我需要使用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应用程序中读取。
答案 0 :(得分:2)
<强> 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