当前位置: 首页 > 面试题库 >

如何从字符串读取numpy二维数组?

桂和同
2023-03-14
问题内容

如何从字符串读取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仅适用于文件。)


问题答案:

挑战在于不仅要保存数据缓冲区,还要保存shape和dtype。
np.fromstring读取数据缓冲区,但作为一维数组;您必须从其他位置获取dtype和形状。

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,并且与numpypickle兼容:

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字符串的标头带有dtypeshape信息:

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可以将其转换为列表。

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]]'


 类似资料:
  • 问题内容: 我正在使用使用Strings的二维数组的程序(一开始可能不是很聪明,但是eh),并且我想编写一个采用这些数组之一的函数(比方说array1),一个独立的副本,并返回它(假设为array2)。但是,当我然后更改array2中的值时,它似乎反映在array1中。 我的函数当前看起来像这样: 我声明一个新的字符串数组,然后对其进行迭代,分别复制每个值。当这不起作用时,我什至尝试从每个旧字符串

  • 在C++中将二维字符数组复制到一维数组字符串中最简单的方法是什么? 大概是这样的: 问候蒂尔曼

  • 问题内容: 我知道如何对一维字符串数组执行此方法,但是如何打印二维数组?使用1D时,我是这样进行的: 如何打印2D阵列? 问题答案: 您只需对元素进行两次迭代: 重要提示: 也很有用,因为您可以链接操作,例如:因为它返回对self的引用!如果可以的话,使用晕厥糖。 重要事项2: 由于在这种情况下,您计划向其添加许多内容,因此最好估算一下避免在添加过程中多次分配和重新定位数组的能力,因此您可以执行以

  • 我正在学习kotlin。我需要创建一个可以保存单词、特殊字符和数字的2D数组。我在其中找到了这段代码这个问题是它只能保存Int。当我尝试将关键字“IntArray”替换为“string”时。它返回了错误ERROR有人能帮我创建一个可以在静态编程语言中保存字符串的10x8数组吗

  • 我有两根绳子 在两种情况下,我应该删除

  • 在java.util.scanner.throwfor(未知源)在java.util.scanner.next(未知源)在java.util.scanner.nextint(未知源)在java.util.scanner.nextint(未知源)在test.main(test.java:6) 如何修复以及如何在数组中输入字符串