将NDARRAY转换为用CpCyle创建的二进制文件:C++中的Mat

2024-09-28 01:26:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个numpyndarray保存{}数据,该数据使用cPickle'sdump()方法以二进制格式存储到一个文件中。在

from cPickle import dump, HIGHEST_PROTOCOL
with open(filePath, 'wb') as f:
    dump(numpyArray, f, protocol=HIGHEST_PROTOCOL)

在撰写本文时,HIGHEST_PROTOCOL使用了cPickle的protocol version 2,但似乎没有太多的文档说明这个协议是如何工作的。在

我要做的是读取这个文件并用数据创建一个cv::Mat对象(see here),这是非常困难的。在

在这一点上,我希望让事情尽快运行,我不太担心性能,存储空间和效率。然而,这些因素可能会在以后变得重要。在

因此,我的问题是,如何将此文件中的数据转换为cv::Mat对象,最简单的方法是什么?如果你认为最简单的方法不一定是最有效的方法,那么我也想听听你对此的想法。请注意,我将使用不同的存储格式,可能只是一个文本文件,如果它将使Python和C++之间的互操作更容易。在

我必须将numpy数组存储到磁盘,因为我需要能够在移动设备(iOS和Android)上打开和读取这个文件,并且使用网络调用来获取数据目前还没有真正在桌面上。在


Tags: 文件数据对象方法格式二进制dumpprotocol
1条回答
网友
1楼 · 发布于 2024-09-28 01:26:21

Pickle可能不是将数据传输到Python之外的其他语言的方便方法。在

实际上,我认为Pickle根本不适合数据存储,因为:

  • 它需要Python
  • 如果它是用比您现在使用的Python版本更新的版本保存的,它可能无法工作
  • 如果不信任数据源,这是不安全的

这并不是说它没有它的用途:它对缓存、个人脚本或进程之间的数据通信等东西都很方便。在

但其他人可能不同意这种观点。在

那么你会用什么呢?以下是一些想法:

  • 二进制格式,使用tofile。这可能是速度和尺寸的最佳选择,而不是很难load。在
  • CSV文件,可能是压缩的(用于1D/2D阵列)。您可以使用savetxt。在
  • JSON,可能是压缩的,带有tolist()dumps。这将是缓慢的,并产生大文件,但它将是可移植的,它将适用于任何维度,甚至不相等的行/列长度。在
  • {a2,如果你可以使用的话。在

只是为了好玩:

  • 将二维小整数数组保存为无损灰度图像。或者更努力,使用3种颜色和alpha通道来存储一个单精度浮点数组。在
  • 使用(Fortan)无格式数据(pythonC),这实际上相当有效地利用了空间,但存在许多可移植性问题。在
  • 作为b64(b85表示额外的点)编码字符串。如果你知道矩阵布局的话,它的可移植性很强(不管怎样是b64),而且可能比纯文本(比如csv)小。在

编辑here is a benchmark for various methods

array storage benchmark

相关问题 更多 >

    热门问题