如何在kdb q中保存二维矩阵为可被Numpy读取的二进制格式?
解决kdb/q矩阵转Numpy可识别二进制文件的问题
问题根源
你之前用set命令保存的是kdb的序列化格式数据,文件中包含kdb的类型标识等元信息,并非纯原始数值字节流,所以Numpy的fromfile/memmap无法正确解析。
可行方案
1. kdb端:输出纯原始二进制字节
直接将展平后的矩阵转换为原始字节流写入文件,避免kdb的序列化元数据:
// 创建测试矩阵 m:(3 4)#12?1.0 // 展平矩阵并写入纯二进制文件(无元数据) 0:`:/home/davidmoss/matrix.bin;0x0 sv raze m
0x0 sv raze m:将展平后的float数组转换为系统原生字节序的原始字节0:filename;data:将字节数据直接写入指定文件,无额外格式包装
2. Python端:读取并恢复矩阵
用Numpy直接读取原始字节,再重塑为目标形状:
import numpy as np # 方法1:一次性读取 matrix = np.fromfile('/home/davidmoss/matrix.bin', dtype=np.float64).reshape(3,4) # 方法2:内存映射(适合超大型矩阵) matrix = np.memmap('/home/davidmoss/matrix.bin', dtype='float64', mode='r', shape=(3,4))
注意事项
- 数据类型必须严格匹配:kdb的
float对应Numpyfloat64,real对应float32,整数类型也要对应一致(如kdblong对应Numpyint64) - 字节序保持一致:
0x0 sv使用系统原生字节序,Numpy默认也是原生字节序,无需额外转换;若跨平台(如kdb在Windows,Python在Linux),需指定字节序(比如用0x1 sv强制大端,Numpy读时加>前缀,如dtype='>float64')
内容的提问来源于stack exchange,提问作者David Moss
相关产品推荐
相关产品推荐

