读取打印的numpy数组

13 投票
2 回答
3249 浏览
提问于 2025-04-18 07:50

有时候,我们打印出来的 numpy 数组是为了分享一些数据,比如这篇帖子。到目前为止,我都是手动转换这些数据。但是帖子里的数组太大了,手动转换实在太麻烦。

我想把一个字符串形式的 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.]]

2 个回答

0

另一个回复的做法很好,但如果值是数字的话,可以简化一些。此外,你可能会有一个多维数组,甚至是多个维度的数组。给定 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)))
14

你可以使用 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))

撰写回答