将字符串ndarray转换为ndarray

时间:2019-03-18 11:40:58

标签: python numpy

我有一个ndarray字符串。我想将其转换回ndarray。 我尝试了newval = np.fromstring(val, dtype=float)。但是它给出了ValueError: string size must be a multiple of element size

我也尝试了newval = ast.literal_eval(val)。这给出了

File "<unknown>", line 1
[-1.45181984e-01  1.51671678e-01  1.59053639e-01 -1.02861412e-01
                               ^
SyntaxError: invalid syntax
  

ndarray的字符串

 '[-1.45181984e-01  1.51671678e-01  1.59053639e-01 -1.02861412e-01
 -9.70948339e-02 -1.75551832e-01 -7.24434480e-02  1.19182713e-01
 -4.54084426e-02 -9.23779532e-02  8.87222588e-02  1.05331177e-02
 -1.31792471e-01  3.50326337e-02 -6.58577830e-02  1.02670217e+00
 -5.29987812e-02  2.09167395e-02 -1.19845152e-01  2.30511073e-02
  2.89404951e-02  4.17387672e-02 -2.08203331e-01  2.34342851e-02]'

如何将其转换回ndarray?

1 个答案:

答案 0 :(得分:5)

根据我的评论进行扩展:

如果您尝试解析从某处获取的NumPy数组的人类可读字符串表示形式,那么您已经在做不应该做的事情。

请改为使用numpy.save()numpy.load()以有效的二进制格式持久存储NumPy数组。

如果您需要人类可读性,而以精度和处理速度为代价,则可以使用.savetxt()。但是永远不要认为str(arr)是您可以再次解析的东西。

但是,要回答您的问题,如果您绝对绝望并且没有办法将数组转换为更好的格式...

>>> data = '''
... [-1.45181984e-01  1.51671678e-01  1.59053639e-01 -1.02861412e-01
...  -9.70948339e-02 -1.75551832e-01 -7.24434480e-02  1.19182713e-01
...  -4.54084426e-02 -9.23779532e-02  8.87222588e-02  1.05331177e-02
...  -1.31792471e-01  3.50326337e-02 -6.58577830e-02  1.02670217e+00
...  -5.29987812e-02  2.09167395e-02 -1.19845152e-01  2.30511073e-02
...   2.89404951e-02  4.17387672e-02 -2.08203331e-01  2.34342851e-02]
... '''.strip()
>>> list_of_floats = [float(x) for x in data.strip('[]').split(None)]
[-0.145181984, 0.151671678, 0.159053639, -0.102861412, -0.0970948339, -0.175551832, -0.072443448, 0.119182713, -0.0454084426, -0.0923779532, 0.0887222588, 0.0105331177, -0.131792471, 0.0350326337, -0.065857783, 1.02670217, -0.0529987812, 0.0209167395, -0.119845152, 0.0230511073, 0.0289404951, 0.0417387672, -0.208203331, 0.0234342851]

编辑:对于评论中提到的OP,

  

我将这些数组作为键值对存储在LevelDB中。数组是快速文本向量。在levelDB中,存储了每个ngram(关键字)的向量(值)。您上面提到的内容在这里适用吗?

是–您将使用BytesIO from the io module模拟NumPy可以写入的内存中“文件”,然后将该缓冲区放入LevelDB,然后逆转该过程(从LevelDB读取到空BytesIO并将其传递到NumPy)阅读:

bio = io.BytesIO()
np.save(bio, my_array)
ldb.put('my-key', bio.getvalue())
# ...
bio = io.BytesIO(ldb.get('my-key'))
my_array = np.load(bio)