将numpy.ndarray转换为字符串(或字节)并将其转换回numpy.ndarray

时间:2015-05-11 12:22:53

标签: python numpy multidimensional-array

我在这里遇到一点麻烦,

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

randomArray.tostring()

它有效,但我想知道我是否可以把它变回numpy.ndarray。

最好的方法是什么?

我正在使用numpy 1.8.1

上下文: 目标是将numpy.ndarray作为消息发送到rabbitmq(pika库)

7 个答案:

答案 0 :(得分:20)

您可以使用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]

对不起,简短的回答,没有足够的评论点。记住要说明数据类型,否则你将陷入痛苦的世界。

答案 1 :(得分:20)

如果您使用println("FIS Contents =\t" + sBuilder.toString()) val source = scala.io.Source.fromFile(filename) println("DRL Source = \n") source.getLines().foreach(x => println(x)) source.close() val fisResource = kieResources.newInputStreamResource(fis) println("Resource = \t" + fisResource) ,则会丢失有关形状和数据类型的信息:

tostring

这意味着您必须将元数据与数据一起发送给收件人。要交换自动一致的对象,请尝试cPickle:

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

答案 2 :(得分:7)

想象一下你有一个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

你也可以使用__repr__()方法,它有利于多维数组:

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

答案 3 :(得分:2)

我知道,我来晚了,但这是正确的做法。使用 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"))) 

用于将数组转换为字符串

使用base64编码将二进制数据转换为一行ASCII字符,并解码为ASCII以获取字符串表示形式。

用于将字符串数组化

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

答案 4 :(得分:0)

对于使用XML-RPC的ajsp答案,这是一个临时的答案。

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

  1. ndarray2str-将numpy ndarray转换为字节字符串。
  2. str2ndarray-将二进制str转换回numpy ndarray。
    def ndarray2str(a):
        # Convert the numpy array to string 
        a = a.tostring()

        return a

在接收方,数据作为'xmlrpc.client.Binary'对象接收。您需要使用“ .data ”访问数据。

    def str2ndarray(a):
        # Specify your data type, mine is numpy float64 type, so I am specifying it as np.float64
        a = np.fromstring(a.data, dtype=np.float64)
        a = np.reshape(a, new_shape)

        return a

注意:这种方法的唯一问题是,发送大型numpy数组时XML-RPC的速度非常慢。我花了大约4秒钟的时间为我发送和接收了一个(10,500,500,3)大小的numpy数组。

我正在使用python 3.7.4。

答案 5 :(得分:0)

这是对数组,数组形状和数组dtype进行编码的快速方法:

def numpy_to_bytes(arr: np.array) -> str:
    arr_dtype = bytearray(str(arr.dtype), 'utf-8')
    arr_shape = bytearray(','.join([str(a) for a in arr.shape]), 'utf-8')
    sep = bytearray('|', 'utf-8')
    arr_bytes = arr.ravel().tobytes()
    to_return = arr_dtype + sep + arr_shape + sep + arr_bytes
    return to_return

def bytes_to_numpy(serialized_arr: str) -> np.array:
    sep = '|'.encode('utf-8')
    i_0 = serialized_arr.find(sep)
    i_1 = serialized_arr.find(sep, i_0 + 1)
    arr_dtype = serialized_arr[:i_0].decode('utf-8')
    arr_shape = tuple([int(a) for a in serialized_arr[i_0 + 1:i_1].decode('utf-8').split(',')])
    arr_str = serialized_arr[i_1 + 1:]
    arr = np.frombuffer(arr_str, dtype = arr_dtype).reshape(arr_shape)
    return arr

要使用功能:

a = np.ones((23, 23), dtype = 'int')
a_b = numpy_to_bytes(a)
a1 = bytes_to_numpy(a_b)
np.array_equal(a, a1) and a.shape == a1.shape and a.dtype == a1.dtype

答案 6 :(得分:-2)

假设您有一个像信使中一样的数字数组

 >>> stex[40]
 array(['Know the famous thing ...

并且要从语料库(文本col = 11)获取统计信息,首先必须从数据帧(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)