pythonnumpy生成的二进制文件由C读取

pythonnumpy生成的二进制文件由C读取,第1张

概述我在 python中创建一个名为random_from_python_int.dat的5 * 7整数矩阵二进制文件,然后我从C读取这个二进制文件.不知何故,我无法得到正确的数字 这是我生成此矩阵的python代码: import numpy as npnp.random.seed(10)filename = "random_from_python_int.dat"fileobj = open @H_403_2@ 我在 python中创建一个名为random_from_python_int.dat的5 * 7整数矩阵二进制文件,然后我从C读取这个二进制文件.不知何故,我无法得到正确的数字
这是我生成此矩阵的python代码:

import numpy as npnp.random.seed(10)filename = "random_from_python_int.dat"fileobj = open(filename,mode='wb')b = np.random.randint(100,size=(5,7))b.tofile(fileobj)fileobj.close

这将生成一个矩阵

[ [  9 15 64 28 89 93 29]  [  8 73 0  40 36 16 11]  [ 54 88 62 33 72 78 49]  [ 51 54 77 69 13 25 13]  [ 92 86 30 30 89 12 65] ]

但是当我从下面的C代码中读到它时:

#include <stdio.h>#include <math.h>int main(){  /* later changed 'double' to 'int',but that still had issues */  double randn[5][7];  char buff[256];  file *latfile;  sprintf(buff,"%s","random_from_python_int.dat");  latfile=fopen(buff,"r");  fread(&(randn[0][0]),sizeof(int),35,latfile);  fclose(latfile);  printf("\n %d     %d     %d     %d     %d     %d     %d",randn[0][0],randn[0][1],randn[0][2],randn[0][3],randn[0][4],randn[0][5],randn[0][6]);  printf("\n %d     %d     %d     %d     %d     %d     %d",randn[1][0],randn[1][1],randn[1][2],randn[1][3],randn[1][4],randn[1][5],randn[1][6]);  printf("\n %d     %d     %d     %d     %d     %d     %d",randn[2][0],randn[2][1],randn[2][2],randn[2][3],randn[2][4],randn[2][5],randn[2][6]);  printf("\n %d     %d     %d     %d     %d     %d     %d",randn[3][0],randn[3][1],randn[3][2],randn[3][3],randn[3][4],randn[3][5],randn[3][6]);  printf("\n %d     %d     %d     %d     %d     %d     %d\n",randn[4][0],randn[4][1],randn[4][2],randn[4][3],randn[4][4],randn[4][5],randn[4][6]);}

它会给我(调整空格以避免在stackoverflow站点上滚动):

28      15         64      93         29 -163754450   9      40      73          0      16         11 -163754450   8      33      88         62      17         91 -163754450  54     256       0 1830354560       0    4196011 -163754450 119 4197424 4197493 1826683808 4196128 2084711472 -163754450  12

我不确定是什么问题.我试过在python中编写一个浮点矩阵并在C中读取它为double,它工作正常.但是这个整数矩阵不起作用.

解决方法 正如@tdube写的那样,你的问题的快速摘要是:你的numpy实现写入64位整数,而你的C代码读取32位整数.

至于更多细节,请继续阅读.

当您将整数作为二进制补码二进制数据进行写入和读取时,需要确保二进制数据的生成者和使用者的以下三个整数属性相同:整数大小,整数字节序,整数签名.

签署了numpy和C签名,所以我们在这里匹配.

这里的字节序不是问题,因为numpy和C程序都在同一台机器上,因此你可能有相同的字节序(不管它实际上是什么字节序).

但是,尺寸是个问题.

默认情况下,numpy.random.randint使用np.int作为其dtype. np.int的文档大小未知,但在您的系统上是64位.

numpy scalars reference列出了几个整数类型(非常不包括np.int),其中三个组合对于与numpy之外的程序进行稳健的接口很有意义:

# | numpy    | C---+----------+--------- 1 | np.int32 | int32_t 2 | np.int64 | int64_t 3 | np.intc  | int

如果您只是将基于numpy的软件连接到用于构建numpy的相同C环境,则使用(np.intc,int)对类型(来自案例3)看起来是安全的.

但是,由于以下原因,我强烈希望使用一种明确大小的类型(案例1和2):

>在numpy和C中,整数的大小是绝对明显的.>因此,您可以使用numpy生成的输出连接到使用不同C环境编译的程序,该环境可能具有不同的int大小.>您甚至可以使用numpy生成的输出连接到用完全不同的语言编写的程序,或者在完全不同的机器上编译和运行.但是,您必须考虑不同机器方案的字节顺序.

@H_403_2@ 总结

以上是内存溢出为你收集整理的python / numpy生成的二进制文件由C读取全部内容,希望文章能够帮你解决python / numpy生成的二进制文件由C读取所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1194017.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存