如何从字符串读取Numpy数组?拿一根绳子,如:
"[[ 0.5544 0.4456], [ 0.8811 0.1189]]"并将其转换为数组:
a = from_string("[[ 0.5544 0.4456], [ 0.8811 0.1189]]")其中a成为对象:np.array([[0.5544, 0.4456], [0.8811, 0.1189]])。
我在找一个非常简单的界面。一种将2D数组(浮点数)转换为字符串的方法,然后再将其读取回来以重构数组:
arr_to_string(array([[0.5544, 0.4456], [0.8811, 0.1189]]))应该返回"[[ 0.5544 0.4456], [ 0.8811 0.1189]]"。
string_to_arr("[[ 0.5544 0.4456], [ 0.8811 0.1189]]")应该返回对象array([[0.5544, 0.4456], [0.8811, 0.1189]])。
理想情况下,arr_to_string应该有一个精度参数来控制浮点转换成字符串的精度,这样就不会得到像0.4444444999999999999999999这样的条目。
我在NumPy文档中找不到这两种方式都能做到的。np.save允许您生成一个字符串,但是没有办法将它加载回(np.load只对文件起作用)。
发布于 2016-02-25 01:28:30
问题是不仅要保存数据缓冲区,还要保存形状和dtype。np.fromstring读取数据缓冲区,但它是一个一维数组;您必须从其他位置获取数据类型和形状。
In [184]: a=np.arange(12).reshape(3,4)
In [185]: np.fromstring(a.tostring(),int)
Out[185]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
In [186]: np.fromstring(a.tostring(),a.dtype).reshape(a.shape)
Out[186]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])保存Python对象的一种由来已久的机制是pickle,而numpy是兼容泡菜的:
In [169]: import pickle
In [170]: a=np.arange(12).reshape(3,4)
In [171]: s=pickle.dumps(a*2)
In [172]: s
Out[172]: "cnumpy.core.multiarray\n_reconstruct\np0\n(cnumpy\nndarray\np1\n(I0\ntp2\nS'b'\np3\ntp4\nRp5\n(I1\n(I3\nI4\ntp6\ncnumpy\ndtype\np7\n(S'i4'\np8\nI0\nI1\ntp9\nRp10\n(I3\nS'<'\np11\nNNNI-1\nI-1\nI0\ntp12\nbI00\nS'\\x00\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x04\\x00\\x00\\x00\\x06\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\n\\x00\\x00\\x00\\x0c\\x00\\x00\\x00\\x0e\\x00\\x00\\x00\\x10\\x00\\x00\\x00\\x12\\x00\\x00\\x00\\x14\\x00\\x00\\x00\\x16\\x00\\x00\\x00'\np13\ntp14\nb."
In [173]: pickle.loads(s)
Out[173]:
array([[ 0, 2, 4, 6],
[ 8, 10, 12, 14],
[16, 18, 20, 22]])有一个numpy函数可以读取泡菜字符串:
In [181]: np.loads(s)
Out[181]:
array([[ 0, 2, 4, 6],
[ 8, 10, 12, 14],
[16, 18, 20, 22]])您在字符串中提到了np.save,但不能使用np.load。解决方法之一是进一步深入代码,并使用np.lib.npyio.format。
In [174]: import StringIO
In [175]: S=StringIO.StringIO() # a file like string buffer
In [176]: np.lib.npyio.format.write_array(S,a*3.3)
In [177]: S.seek(0) # rewind the string
In [178]: np.lib.npyio.format.read_array(S)
Out[178]:
array([[ 0. , 3.3, 6.6, 9.9],
[ 13.2, 16.5, 19.8, 23.1],
[ 26.4, 29.7, 33. , 36.3]])save字符串有一个包含dtype和shape信息的头部:
In [179]: S.seek(0)
In [180]: S.readlines()
Out[180]:
["\x93NUMPY\x01\x00F\x00{'descr': '<f8', 'fortran_order': False, 'shape': (3, 4), } \n",
'\x00\x00\x00\x00\x00\x00\x00\x00ffffff\n',
'@ffffff\x1a@\xcc\xcc\xcc\xcc\xcc\xcc#@ffffff*@\x00\x00\x00\x00\x00\x800@\xcc\xcc\xcc\xcc\xcc\xcc3@\x99\x99\x99\x99\x99\x197@ffffff:@33333\xb3=@\x00\x00\x00\x00\x00\x80@@fffff&B@']如果您想要一个人类可读的字符串,您可以尝试json。
In [196]: import json
In [197]: js=json.dumps(a.tolist())
In [198]: js
Out[198]: '[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]'
In [199]: np.array(json.loads(js))
Out[199]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])从数组的列表表示形式出发是json最明显的用法。可能有人已经编写了一个更精细的数组json表示。
您也可以选择csv格式的路径--关于读取/写入csv数组有很多问题。
'[[ 0.5544 0.4456], [ 0.8811 0.1189]]'是用于此目的的不良字符串表示形式。它确实很像数组的str(),但使用的是,而不是\n。但是没有一种解析嵌套[]的清晰方法,缺少的分隔符是一种痛苦。如果它始终使用,,那么json可以将其转换为list。
np.matrix接受类似于MATLAB的字符串:
In [207]: np.matrix(' 0.5544, 0.4456;0.8811, 0.1189')
Out[207]:
matrix([[ 0.5544, 0.4456],
[ 0.8811, 0.1189]])
In [208]: str(np.matrix(' 0.5544, 0.4456;0.8811, 0.1189'))
Out[208]: '[[ 0.5544 0.4456]\n [ 0.8811 0.1189]]'发布于 2017-06-02 07:17:43
转发到字符串:
import numpy as np
def array2str(arr, precision=None):
s=np.array_str(arr, precision=precision)
return s.replace('\n', ',')倒转到数组:
import re
import ast
import numpy as np
def str2array(s):
# Remove space after [
s=re.sub('\[ +', '[', s.strip())
# Replace commas and spaces
s=re.sub('[,\s]+', ', ', s)
return np.array(ast.literal_eval(s))如果使用repr()将数组转换为字符串,则转换将非常简单。
发布于 2016-02-24 20:45:55
如果您的内部列表中没有逗号,我不确定有什么简单的方法可以做到这一点,但是如果您这样做了,那么您可以使用ast.literal_eval
import ast
import numpy as np
s = '[[ 0.5544, 0.4456], [ 0.8811, 0.1189]]'
np.array(ast.literal_eval(s))
array([[ 0.5544, 0.4456],
[ 0.8811, 0.1189]])编辑:我还没有对它进行太多的测试,但是您可以使用re在需要它们的地方插入逗号:
import re
s1 = '[[ 0.5544 0.4456], [ 0.8811 -0.1189]]'
# Replace spaces between numbers with commas:
s2 = re.sub('(\d) +(-|\d)', r'\1,\2', s1)
s2
'[[ 0.5544,0.4456], [ 0.8811,-0.1189]]'然后把手交给ast.literal_eval
np.array(ast.literal_eval(s2))
array([[ 0.5544, 0.4456],
[ 0.8811, -0.1189]])(您需要小心匹配数字之间的空格,但也需要匹配数字和减号之间的空格)。
https://stackoverflow.com/questions/35612235
复制相似问题