Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将存储的ndarray转换为使用C+;中的cPickle to cv::Mat创建的二进制文件+;_Python_C++_Opencv_Numpy_Pickle - Fatal编程技术网

Python 将存储的ndarray转换为使用C+;中的cPickle to cv::Mat创建的二进制文件+;

Python 将存储的ndarray转换为使用C+;中的cPickle to cv::Mat创建的二进制文件+;,python,c++,opencv,numpy,pickle,Python,C++,Opencv,Numpy,Pickle,我有一个ndarray保存numpy.float64数据,该数据使用dump()方法以二进制格式存储到文件中 from cPickle import dump, HIGHEST_PROTOCOL with open(filePath, 'wb') as f: dump(numpyArray, f, protocol=HIGHEST_PROTOCOL) 在撰写本文时,HIGHEST_协议使用了cPickle,但似乎没有多少关于该协议具体工作原理的文档 我试图做的是读取这个文件并用数据创建

我有一个
ndarray
保存
numpy.float64
数据,该数据使用
dump()
方法以二进制格式存储到文件中

from cPickle import dump, HIGHEST_PROTOCOL
with open(filePath, 'wb') as f:
    dump(numpyArray, f, protocol=HIGHEST_PROTOCOL)
在撰写本文时,
HIGHEST_协议
使用了cPickle,但似乎没有多少关于该协议具体工作原理的文档

我试图做的是读取这个文件并用数据创建一个
cv::Mat
对象(),这被证明是非常困难的

在这一点上,我希望能够尽快完成工作,而且我不太担心性能、存储空间和效率。然而,这些因素以后可能会变得很重要

因此,我的问题是,将此文件中的数据转换为
cv::Mat
对象的最简单方法是什么?如果你认为最简单的方法不一定是最有效的方法,那么我也想听听你对此的想法。请注意,我可以使用不同的存储格式,可能只是一个文本文件,如果它能使Python和C++之间的互操作更容易。
我必须将
numpy
数组存储到磁盘上,因为我需要能够在移动设备(iOS和Android)上打开和读取此文件,而使用网络调用获取数据目前还不在桌面上。

Pickle可能不是将数据传输到Python以外语言的方便方法

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

  • 它需要Python
  • 如果使用比当前使用的Python版本更高的Python版本保存,则可能无法正常工作
  • 如果不信任数据源,则不安全
这并不是说它没有它的用途:它便于缓存、个人脚本或进程之间的数据通信

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

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

  • 二进制格式,使用
    tofile
    。这可能是追求速度和尺寸的方法,而且不太难做到
  • CSV文件,可能已压缩(用于1D/2D阵列)。您可以使用
    savetxt
  • JSON,可能是压缩的,带有
    tolist()
    转储文件
    。这将是缓慢的,并产生大文件,但它将是可移植的,它将适用于任何维度,甚至不相等的行/列长度
  • 如果你可以使用熊猫,它支持
更多只是为了好玩:

  • 将小整数的二维数组另存为无损灰度图像。或者更努力地使用3种颜色和alpha通道来存储单个精度浮点数组
  • 使用(Fortan)无格式数据(,),这实际上相当有效地利用了空间,但受到许多可移植性问题的困扰
  • 作为b64(b85表示额外点数)编码字符串。如果您知道矩阵布局,那么它是非常可移植的(反正是b64),并且可能比纯文本(比如csv)小
编辑::


在工作中,我们避免了酸洗,而是使用numpy中的原始字节数组。我们得到字节数组,用lz4压缩它,然后用其他语言重建数组就很容易了。我们使用MUGODB来存储LZ4压缩字节数组。谢谢这个建议,但是最后我决定把<代码> NDAREX < /C> >作为CSV,然后加载到C++中。我知道这不是最有效的解决方案,但就目前而言,它是有效的。