【问题标题】:How to save lambda function using numpy savez? [duplicate]如何使用 numpy savez 保存 lambda 函数? [复制]
【发布时间】:2020-05-30 03:37:53
【问题描述】:

我知道savez_compressed可以保存scipy生成的函数。有没有办法保存lambda函数?

尝试:

import numpy as np
from scipy.interpolate import interp1d
xAxis = np.array([1,2,3,4])
data = np.array([1,3,5,6])

yAxisInterp = interp1d(xAxis, data, kind='linear')

np.savez_compressed('myDataLambda.npz', yAxisInterp=yAxisInterp)
print('yAxisInterp is saved')

# Following command does not work
# ------------------------------
yAxisLambda = lambda x : x

np.savez_compressed('myData.npz', yAxisLambda=yAxisLambda)
print('yAxisLambda is saved')

【问题讨论】:

  • 其实我搜了一些可以保存功能的包,但是我想问问有没有np.save的选项?
  • yAxisInterp 不是函数。它是interp1d 类的对象,带有__call__pickle.dumps(yAxisInterp)loads 一样工作。大概它正在保存您可以使用vars(yAxisInterp) 看到的属性。
  • 我可以pickle 一个函数,但不能lambda。这意味着我也可以np.save 它。但是load必须allow_pickle,检索到的函数会嵌入到一个0d对象dtype数组中。
  • 我认为 lambda 函数对 python 有不同的行为。感谢您的支持@hpaulj

标签: python python-3.x numpy


【解决方案1】:

不,numpy.savez保存scipy中的函数,它保存了numpy.ndarray对象,这些对象返回来自那些scipy 函数。

也就是说,当你这样做时:

yAxisInterp = interp1d(xAxis, data, kind='linear')

您已经创建了一个数组,这就是您在执行此操作时要保存的内容:

np.savez_compressed('myDataLambda.npz', yAxisInterp=yAxisInterp)

没有保存函数

所以不,你不能用numpy.savez(和相关方法)保存函数,任何函数。

【讨论】:

  • yAxisInterp 不是数组。这是一个 scipy 类的实例。我可以save 一个函数,或者任何可以是pickled 的东西。 lambda 不能腌制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多