将numpy数组转换为字符串数组python

时间:2018-04-09 16:40:58

标签: python arrays numpy

我试图将我的numpy.ndarray变成python中的普通字符串数组

我试图通过转换numpy数组通过toString来做到这一点,尽管这不能按预期工作。

opencvImage是数组的名称

import numpy as np

arr = opencvImage
ts = arr.tostring()
aa = np.fromstring(ts)
aa = np.fromstring(arr, dtype=int) 

2 个答案:

答案 0 :(得分:0)

我相信您正在寻找tolist()功能

x = np.array([1, 2, 3, 4])
print(type(x)) # output <class 'numpy.ndarray'>
x = x.tolist()
print(type(x)) # output <class 'list'>

答案 1 :(得分:0)

tostring从数组数据缓冲区生成一个字节串。但它不会保存任何dtypeshape信息。

为了说明,制作一个简单的12整数数组:

In [24]: arr = np.arange(12).reshape(3,4)
In [25]: arr
Out[25]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [26]: ts = arr.tostring()
In [27]: ts
Out[27]: b'\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00'

查看文档,这是tobytes的另一个名称。您应该能够将此字符串保存为sql

但是重新创建数组需要更多信息:

In [28]: np.fromstring(ts)
/usr/local/bin/ipython3:1: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
  #!/usr/bin/python3
Out[28]: 
array([2.12199579e-314, 6.36598737e-314, 1.06099790e-313, 1.48539705e-313,
       1.90979621e-313, 2.33419537e-313])

我们需要指定dtype。默认值为float

In [29]: np.fromstring(ts, dtype=int)
/usr/local/bin/ipython3:1: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
  #!/usr/bin/python3
Out[29]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

注意警告:

In [30]: np.frombuffer(ts, dtype=int)
Out[30]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

pickle可能会更好。它保留了dtype和形状信息:

In [34]: import pickle
In [35]: tss = pickle.dumps(arr)
In [36]: tss
Out[36]: b'\x80\x03cnumpy.core.multiarray\n_reconstruct\nq\x00cnumpy\nndarray\nq\x01K\x00\x85q\x02C\x01bq\x03\x87q\x04Rq\x05(K\x01K\x03K\x04\x86q\x06cnumpy\ndtype\nq\x07X\x02\x00\x00\x00i4q\x08K\x00K\x01\x87q\tRq\n(K\x03X\x01\x00\x00\x00<q\x0bNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\x0cb\x89C0\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00q\rtq\x0eb.'
In [37]: pickle.loads(tss)
Out[37]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

pickle实际上使用np.save生成字符串。