Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将numpy.ndarray转换为字符串(或字节),然后将其转换回numpy.ndarray_Python_Numpy_Multidimensional Array - Fatal编程技术网

Python 将numpy.ndarray转换为字符串(或字节),然后将其转换回numpy.ndarray

Python 将numpy.ndarray转换为字符串(或字节),然后将其转换回numpy.ndarray,python,numpy,multidimensional-array,Python,Numpy,Multidimensional Array,我这里有点小麻烦 我正在尝试将numpy.ndarray转换为字符串,我已经这样做了: randomArray.tostring() 它可以工作,但我想知道是否可以将它转换回numpy.ndarray 最好的方法是什么 我正在使用NUMPY1.8.1 背景: 目标是将numpy.ndarray作为rabbitmq(pika库)中的消息发送。假设您有一个整数的numpy数组(它可以与其他类型一起使用,但需要稍加修改)。您可以这样做: a = np.array([0, 3, 5]) a_str =

我这里有点小麻烦

我正在尝试将numpy.ndarray转换为字符串,我已经这样做了:

randomArray.tostring()
它可以工作,但我想知道是否可以将它转换回numpy.ndarray

最好的方法是什么

我正在使用NUMPY1.8.1

背景:
目标是将numpy.ndarray作为rabbitmq(pika库)中的消息发送。

假设您有一个整数的numpy数组(它可以与其他类型一起使用,但需要稍加修改)。您可以这样做:

a = np.array([0, 3, 5])
a_str = ','.join(str(x) for x in a) # '0,3,5'
a2 = np.array([int(x) for x in a_str.split(',')]) # np.array([0, 3, 5])
如果您有一个浮点数组,请确保在最后一行中将
int
替换为
float

您还可以使用
\uuuu repr\uuuu()
方法,这将有利于处理多维数组:

from numpy import array
numpy.set_printoptions(threshold=numpy.nan)
a = array([[0,3,5],[2,3,4]])
a_str = a.__repr__() # 'array([[0, 3, 5],\n       [2, 3, 4]])'
a2 = eval(a_str) # array([[0, 3, 5],
                 #        [2, 3, 4]])

您可以使用
fromstring()
方法:

arr = np.array([1, 2, 3, 4, 5, 6])
ts = arr.tostring()
print(np.fromstring(ts, dtype=int))

>>> [1 2 3 4 5 6]
很抱歉,答案很短,没有足够的分数进行评论。记住陈述数据类型,否则你将陷入痛苦的世界

从numpy 1.14开始的字符串
注释

sep:str,可选

数据中分隔数字的字符串;元素之间的额外空白也被忽略


从版本1.14起已弃用:传递sep='',默认值,已弃用,因为它将触发此函数的弃用二进制模式。此模式将字符串解释为二进制字节,而不是带十进制数的ASCII文本,这是一种更好地从缓冲区(字符串、数据类型、计数)拼写的操作。如果字符串包含unicode文本,则fromstring的二进制模式将首先使用utf-8(python 3)或默认编码(python 2)将其编码为字节,两者都不会产生正常的结果。

如果使用
tostring
则会丢失有关形状和数据类型的信息:

>>> import numpy as np
>>> a = np.arange(12).reshape(3, 4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> s = a.tostring()
>>> aa = np.fromstring(a)
>>> aa
array([  0.00000000e+000,   4.94065646e-324,   9.88131292e-324,
         1.48219694e-323,   1.97626258e-323,   2.47032823e-323,
         2.96439388e-323,   3.45845952e-323,   3.95252517e-323,
         4.44659081e-323,   4.94065646e-323,   5.43472210e-323])
>>> aa = np.fromstring(a, dtype=int)
>>> aa
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
>>> aa = np.fromstring(a, dtype=int).reshape(3, 4)
>>> aa
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
这意味着您必须将元数据和数据一起发送给收件人。要交换自动一致性对象,请尝试cPickle:

>>> import cPickle
>>> s = cPickle.dumps(a)
>>> cPickle.loads(s)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

想象一下,您有一个文本的numpy数组,就像在messenger中一样

 >>> stex[40]
 array(['Know the famous thing ...
要从语料库(text col=11)中获取统计信息,首先必须从dataframe(df5)中获取值,然后将所有记录合并到一个语料库中:

 >>> stex = (df5.ix[0:,[11]]).values
 >>> a_str = ','.join(str(x) for x in stex)
 >>> a_str = a_str.split()
 >>> fd2 = nltk.FreqDist(a_str)
 >>> fd2.most_common(50)

这是一个使用XML-RPC的临时答案

在服务器端,当您转换数据时,使用 '.tostring()'方法。这将numpy ndarray编码为字节字符串。在客户端,当您收到数据时,请使用'.fromstring()'方法对其进行解码。我为此编写了两个简单的函数。希望这是有帮助的

  • ndarray2str——将numpy ndarray转换为字节字符串
  • str2ndarray——将二进制str转换回numpy ndarray
  • def ndarray2str(a):
    #将numpy数组转换为字符串
    a=a.tostring()
    归还
    
    在接收方,数据作为'xmlrpc.client.Binary'对象接收。您需要使用“.data”访问数据

    def标准阵列(a):
    #指定您的数据类型,我的是numpy float64类型,所以我将其指定为np.float64
    a=np.fromstring(a.data,dtype=np.float64)
    a=np.重塑(a,新形状)
    归还
    
    注意:这种方法的唯一问题是,XML-RPC在发送大型numpy数组时速度非常慢。我花了大约4秒钟的时间发送和接收一个(1050500,3)大小的numpy阵列


    我使用的是python 3.7.4。

    这是一种对数组、数组形状和数组数据类型进行编码的快速方法:

    def numpy_到_字节(arr:np.array)->str:
    arr_dtype=bytearray(str(arr.dtype),'utf-8')
    arr_shape=bytearray(',').join([str(a)表示arr.shape中的a]),'utf-8')
    sep=字节数组(“|”和“utf-8”)
    arr_bytes=arr.ravel().tobytes()
    to_return=arr_数据类型+sep+arr_形状+sep+arr_字节
    返回
    def bytes_to_numpy(序列化的_arr:str)->np.array:
    sep=“|”。编码('utf-8')
    i_0=序列化的数组查找(sep)
    i_1=序列化的数组查找(sep,i_0+1)
    arr\u dtype=serialized\u arr[:i\u 0]。解码('utf-8')
    arr_shape=tuple([int(a)表示序列化的_arr[i_0+1:i_1]。解码('utf-8')。拆分(','))
    arr_str=序列化的_arr[i_1+1:]
    arr=np.frombuffer(arr\u str,dtype=arr\u dtype)。重塑(arr\u形状)
    返回arr
    
    要使用这些功能,请执行以下操作:

    a=np.one((23,23),dtype='int')
    a_b=numpy_到_字节(a)
    a1=字节数到字节数(a\u b)
    np.array_equal(a,a1)和a.shape==a1.shape和a.dtype==a1.dtype
    
    我知道,我迟到了,但这里有正确的方法。使用base64。此技术将数组转换为字符串

    import base64
    import numpy as np
    random_array = np.random.randn(32,32)
    string_repr = base64.binascii.b2a_base64(random_array).decode("ascii")
    array = np.frombuffer(base64.binascii.a2b_base64(string_repr.encode("ascii"))) 
    array = array.reshape(32,32)
    
    用于将数组转换为字符串

    在base64编码中将二进制数据转换为一行ASCII字符,并解码为ASCII以获得字符串repr

    用于字符串到数组

    首先,将字符串编码为ASCII格式,然后
    将base64数据块转换回二进制并返回二进制数据。

    您可能会发现这个答案很有用:[1]:遗憾的是,tostring()方法返回字节,即使使用此解决方案,我也不知道如何将其转换。请注意
    .tostring()
    ,首选拼写为
    .tobytes()
    。另外两个有相同的行为。我不知道
    fromstring
    ,很好!但是,它似乎不适用于多维数组(返回多维数组的
    flat
    版本)。我想如果你知道维度的话,你可以在以后重塑数组。这可能会起作用,奇怪的是我的
    tostring()
    方法返回奇怪的东西(字节?)
    fromstring()
    工作得不太好。@Ampo你可以使用repr(ts)来查看二进制文件,但是你必须使用np.fromstring(ts,dtype=int)来转换它,请记住使用正确的数据类型。您使用的是浮点数还是整数?张贴您正在尝试的数组类型