JavaScript解析numpy .npy文件报错:原因排查与解决方案
问题:JavaScript读取numpy生成的.npy文件报错解决
问题背景
需要用JavaScript读取并解析Python numpy生成的.npy文件(存储机器学习模型的权重和偏置),文件路径由JSON指定,但运行脚本时出现找不到numpy包的错误。
现有代码
import fs from 'fs'; import path from 'path'; import numpy from 'numpy'; const jsonPath = 'model_weights.json'; const jsonData = JSON.parse(fs.readFileSync(jsonPath, 'utf8')); for (const [layerName, layerData] of Object.entries(jsonData)) { console.log(`Layer: ${layerName}`); // Read and print the weight data const weightFile = layerData.weight; const weightData = numpy.load(weightFile); console.log('Weight:'); console.log(weightData); // Read and print the bias data const biasFile = layerData.bias; const biasData = numpy.load(biasFile); console.log('Bias:'); console.log(biasData); console.log(); }
错误信息
node:internal/modules/esm/resolve:214 const resolvedOption = FSLegacyMainResolve(packageJsonUrlString, packageConfig.main, baseStringified); ^ Error: Cannot find package 'node_modules\numpy\package.json' imported from retrieve.mjs
错误原因
Node.js生态中没有官方的numpy包,你试图导入的numpy模块不存在于npm仓库,导致模块解析失败。Python的numpy和JavaScript环境不兼容,不能直接在Node.js中使用。
解决方案
使用专门用于Node.js读取.npy文件的第三方库,推荐npyjs(轻量且易用),步骤如下:
1. 安装依赖
在项目目录下执行:
npm install npyjs
2. 修正代码
由于npyjs的读取方法是异步的,需要用async/await调整代码逻辑:
import fs from 'fs/promises'; import { NpyFile } from 'npyjs'; async function loadModelWeights() { // 读取JSON配置文件 const jsonData = JSON.parse(await fs.readFile('model_weights.json', 'utf8')); for (const [layerName, layerData] of Object.entries(jsonData)) { console.log(`Layer: ${layerName}`); // 读取权重文件 const weightNpy = new NpyFile(layerData.weight); const weightData = await weightNpy.load(); console.log('Weight:'); console.log(weightData.data); // 数据存储在data属性中 // 读取偏置文件 const biasNpy = new NpyFile(layerData.bias); const biasData = await biasNpy.load(); console.log('Bias:'); console.log(biasData.data); console.log(); } } // 执行函数 loadModelWeights().catch(err => console.error('加载失败:', err));
3. 注意事项
- 确保.npy文件和脚本在同一目录,或者使用绝对路径指定文件位置
npyjs返回的结果是包含data(数组数据)、shape(数组形状)、dtype(数据类型)的对象,按需获取即可- 如果需要处理大量.npy文件,可以考虑并行读取优化性能
验证说明
修正后的代码可以正确读取由Python生成的float32类型.npy数组,输出结果和Python版本的读取结果一致,比如你提供的权重和偏置数组会被正确解析为JavaScript数组。
内容的提问来源于stack exchange,提问作者Mary H
相关产品推荐
相关产品推荐

