【问题标题】:Converting numpy arrays exported as text into numpy arrays again再次将导出为文本的 numpy 数组转换为 numpy 数组
【发布时间】:2019-07-23 18:10:11
【问题描述】:

我将代码的输出复制并粘贴到一个文本文件中以供以后使用。此输出是一个字典,其中一些值是 numpy 数组,但这些值被复制到文本文件中,例如"key": array([0])。 当我复制并粘贴回 IPython 控制台时,我收到以下错误:NameError: name 'array' is not defined

我想恢复整个字典,将这些 numpy 数组转换回 numpy 对象以继续使用数据。有几层字典存储为“父”字典的值,每层有许多字典,每个字典中有许多这样的数组。 有没有办法恢复这本词典?您如何建议我下次保存对象以供下次会话使用?

【问题讨论】:

  • “我将我的代码输出复制并粘贴到一个文本文件中以供以后使用。”不要那样做。这不是一个合理的做法。您应该使用 许多 种不同的内置序列化方法之一。 pickle 将是最通用的方式,可能会满足您的需求。我不确定恢复原始对象是否可能,因为 numpy 有时会截断输出。
  • 数组列表的类似问题:stackoverflow.com/questions/57168280/…

标签: python arrays numpy dictionary


【解决方案1】:

如果您需要恢复之前计算的输出,您可以执行以下操作之一:

  • from numpy import array
  • 全部替换你的文本文件array -> numpy.array

然后将文本传递给eval(如果您直接在命令行中执行此操作,或者从文件中复制/粘贴数据,则可以跳过 eval altogheter。如果您存储了数据,这很有用在一个字符串中,例如,在从 python 中的文件中读取它之后)

from numpy import array

a="""
{
    '1':array([0]),
    '2':'some random text',
    '3':123,
    '4':{
        '4.1':array([1,2,3]),
        '4.2':{
            '4.2.1':'more nested stuff'
        }
    }
}
"""

b = eval(a)

print(b)
# {'1': array([0]), '2': 'some random text', '3': 123, '4': {'4.1': array([1, 2, 3]), '4.2': {'4.2.1': 'more nested stuff'}}}

作为旁注,切勿对您以外的其他来源的输出运行 eval。 这实际上是将文本作为 python 代码执行,显然很容易受到恶意软件的攻击。

更安全的方法是使用ast 中的ast.literal_eval。在这种情况下,问题是出于安全原因,它将始终处理不包括 numpy 的 python 内置函数。

关于存储数据的其他方式,如 cmets 中所建议的,pickle 可能会为您完成

fname = 'output.pickle'

import pickle
# Sava data into file
with open(fname, 'wb') as f:
    pickle.dump(b, f)

# Restore data from file
with open(fname, 'rb') as f:
    c = pickle.load(f)

print(c)

# {'1': array([0]), '2': 'some random text', '3': 123, '4': {'4.1': array([1, 2, 3]), '4.2': {'4.2.1': 'more nested stuff'}}}

【讨论】:

    猜你喜欢
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2017-03-08
    • 2021-12-18
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多