如何在VSCode的Jupyter Notebook中向Python脚本传递NumPy数组?
在Jupyter Notebook中通过%run魔术命令传递NumPy数组给Python脚本
问题根源
%run魔术命令默认会把你传入的参数当作字符串字面量传递给脚本,而非Notebook中已定义的变量引用,所以你拿到的是数组变量的名称字符串,不是实际的NumPy数组。下面是几种可行的解决方法:
方法1:使用-i参数注入Notebook命名空间
这是最简便的方案,-i参数会让脚本直接访问当前Notebook的命名空间,无需手动传参。
Notebook端代码
import numpy as np # 定义你需要的变量 string1 = "sample_str1" string2 = "sample_str2" NumpyArray1 = np.random.rand(432, 532) # 你的432×532二维矩阵
执行%run命令
%run -i myScript.py
脚本myScript.py代码
直接使用Notebook中定义的变量即可:
import numpy as np # 直接访问Notebook里的变量 print(type(NumpyArray1)) # 输出:<class 'numpy.ndarray'> print(NumpyArray1.shape) # 输出:(432, 532) print(string1, string2) # 输出:sample_str1 sample_str2
方法2:序列化数组后传递(适合隔离命名空间场景)
如果不想让脚本直接访问Notebook的命名空间,可以用pickle将数组序列化到临时文件,脚本读取后还原。
Notebook端代码
import pickle import numpy as np import os string1 = "sample_str1" string2 = "sample_str2" NumpyArray1 = np.random.rand(432, 532) # 序列化数组到临时文件 temp_file = "temp_array.pkl" with open(temp_file, "wb") as f: pickle.dump(NumpyArray1, f) # 传递字符串参数和临时文件名 %run myScript.py $string1 $string2 $temp_file
脚本myScript.py代码
import sys import pickle import os # 获取命令行参数 string1 = sys.argv[1] string2 = sys.argv[2] temp_file = sys.argv[3] # 从临时文件加载数组 with open(temp_file, "rb") as f: NumpyArray1 = pickle.load(f) # 验证结果 print(type(NumpyArray1)) print(NumpyArray1.shape) # 可选:删除临时文件 os.remove(temp_file)
注意事项
- 不要尝试用
%run myScript.py $NumpyArray1直接传递数组:$符号会把数组转成字符串(比如<numpy.ndarray object at 0x...>),无法还原成原数组。 - 如果脚本需要接收多个变量,
-i参数会自动共享所有Notebook当前命名空间的变量,无需逐个指定。
内容的提问来源于stack exchange,提问作者PPM
相关产品推荐
相关产品推荐

