我有一个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?
答案 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)