【问题标题】:Read printed numpy array读取打印的 numpy 数组
【发布时间】:2014-05-28 14:39:48
【问题描述】:

有时会提供打印的numpy 数组来共享this post 等数据。到目前为止,我手动转换了它。但是帖子中的数组太大了,无法手动转换。

我想将numpy 数组的字符串表示形式转换回数组。 (谢谢,@LevLevitsky。我参考了你的表达。)

我试过这段代码

import numpy as np

print np.array([[0, 1], [2, 3]])
#[[0 1]
# [2 3]]

# the output is
output = '''[[0 1]
 [2 3]]'''

import re
pat_ignore = re.compile(r'[\[\]]')
numbers = pat_ignore.sub('', output)
print np.array([map(float, line.split()) for line in numbers.splitlines()])
[[ 0.  1.]
 [ 2.  3.]]

但是,这无法保留数据类型。另外如果ndim > 3,也不能正常工作。

[[[0 1]
  [2 3]]]

被解释为

[[ 0.  1.]
 [ 2.  3.]]

【问题讨论】:

  • 我不明白这个问题。你想看到整个 numpy 数组打印在屏幕上,而不管大小?您想确保保留数据类型吗?
  • @mauve OP 想要将 numpy 数组的字符串表示形式转换回数组 AFAICT。
  • @LevLevitsky 正确。谢谢。
  • 好吧,你必须添加一些逻辑,在开始时计算打开括号的数量并从那里派生数组维度。然后根据维度,您需要进行一些额外的解析以确保您可以处理更高维度的数组。
  • This answer 显示了类似的方法,先使用re.sub,然后使用ast.literal_eval

标签: python arrays numpy


【解决方案1】:

您可以使用re 处理字符串,然后使用eval() 创建数组:

 import re
 from ast import literal_eval

 import numpy as np

 a = """[[[ 0 1]
          [ 2 3]]]"""
 a = re.sub(r"([^[])\s+([^]])", r"\1, \2", a)
 a = np.array(literal_eval(a))

【讨论】:

  • 强制说明:eval 不安全,应避免使用。请改用ast.literal_eval
  • 如果 numpy 使用浮点数,它(有时?)在前导 [ 和第一个数字之间插入一个空格。用这段代码sn-p,这个空格会被转成逗号,这样会使值无效。
  • @max 你有解决这个问题的办法吗?
  • @max 我为这种情况添加了一个更好的正则表达式
  • @muammar 我更新了正则表达式以考虑 max 的情况
【解决方案2】:

另一个回复效果很好,但如果值为数字,则可以采取一些捷径。此外,您可能有一个具有多个维度甚至多个订单的数组。给定npstr,你的 str(np.array):

import re, json
import numpy as np

# 1. replace those spaces and newlines with commas.
# the regex could be '\s+', but numpy does not add spaces.
t1 = re.sub('\s',',',npstr)
# 2. covert to list
t2 = json.loads(t1)
# 3. convert to array
a = np.array(t2)

在一行中(格式肯定不好,但适合复制粘贴):

a = np.array(json.loads(re.sub('\s',',',npstr)))

【讨论】:

  • 可能是因为 numpy 添加了比以前更多的空白填充,我不得不将正则表达式更改为 (?<=\d|])\s+(?=\d|\[)(额外的填充可能是因为我使用了不同长度的长浮点数,并且 numpy 对齐小数点和数字)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 2019-02-23
  • 2017-04-15
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
相关资源
最近更新 更多