2016-03-31 70 views
1

我有花车的巨大numpy的阵列,说〜1500 * 2500px,我想如何序列化一个浮点数的浮点数到一个字符串?

  1. 转换这个数组的list(如JavaScript)(例如[[0.1,0.3,0.2],[0.1,0.3,0.2]]
  2. 它序列化到一个字符串POST请求到服务器。

我不知道该怎么办(1)。对于(2)我看了numpy.array_str(),array2string()array_repr()函数,它们返回数组的表示而不是整个数组。

我该怎么做?

+0

什么是你期望的字符串? –

回答

-1

你可以将其转换为一个普通的Python列表,然后将一个字符串

arr = np.random.rand((10,10)) 
final_string = str(arr.tolist()) 

导致

[0.7998950511604668,0.3504357174428122,0.4516363276829708,0.42090556177992977],[0.5151195486975273,0.7101183117731774,0.9530575343271824 ,0.39869760958795464],[0.20318293100519536,0.117244659329654555,0.3530236209359401,0.2081303162461341],[0.9186758779272243,0.9300730012004015,0.114151513893149895,0.33915493832613735]]

+2

Python对象的默认字符串表示是序列化有点挥发的选择。 'json.dumps'将提供更稳定的方法,但目前它会产生相同的结果。 –

1

我不确定你为什么要这样做“这个数组看起来像一个JavaScript数组,所以我假设(因为我可以在没有相反信息的情况下自由做),你希望将阵列与一些不幸的前端进程进行通信:几乎有四百万个元素仍然是大量数据流入网络管道。所以,一如既往,该问题的一些背景将会有所帮助(并且您可以编辑您的问题以提供该问题)。

假设你想要序列化数据进行传输或存储,那么最简单的方法就是将它呈现为一个可理解为JavaScript的字符串(我没有想知道“[look?] like”的含义)是使用json标准图书馆。由于这不能本地编码除int,float,真值和字符串的列表和字符串之外的任何内容,所以您仍然面临着如何最好地将列表表示为列表列表的问题。

小例子,但你必须接受这是在黑暗中随机拍摄。首先 让我们创建一个可管理的数据集一起工作:

a = np.random.randn(4, 5) 

这不能直接代表了JSON:造成相当冗长

import json 
try: 
    json.dumps(a) 
except Exception as e: 
    print "Exception", e 

(它可能只是调用对象的repr),但可以理解和真实的消息

Exception array([[ 1.24064541, 0.97989932, -0.8469167 , -0.27318908, 1.21954134], 
     [-1.30172725, 0.41261504, 1.39895842, 0.75260258, -1.34749298], 
     [-0.38415007, -0.56925321, -1.59202204, 1.29900292, 1.91357277], 
     [ 1.06254537, 2.75700739, -0.66371951, 1.36906192, -0.3973517 ]]) is not JSON serializable 

如果我们要求解释器将数组转换为列表,它会做一个半心半意的工作,将其转换成阵列的对象的列表:

list(a) 

显示作为其结果

[array([ 1.24064541, 0.97989932, -0.8469167 , -0.27318908, 1.21954134]), 
array([-1.30172725, 0.41261504, 1.39895842, 0.75260258, -1.34749298]), 
array([-0.38415007, -0.56925321, -1.59202204, 1.29900292, 1.91357277]), 
array([ 1.06254537, 2.75700739, -0.66371951, 1.36906192, -0.3973517 ])] 

使用相同的函数来那些阵列转换成列表产生列表的可用列表:

list(list(r) for r in a) 

评价为

[[1.2406454087805279, 
    0.97989932000522928, 
    -0.84691669720415574, 
    -0.27318907894171163, 
    1.219541337120247], 
[-1.3017272505660062, 
    0.41261503624079976, 
    1.3989584188044133, 
    0.75260257672408482, 
    -1.3474929807527067], 
[-0.38415007296182629, 
    -0.56925320938196644, 
    -1.5920220380072485, 
    1.2990029230603588, 
    1.9135727724853433], 
[1.0625453748520415, 
    2.7570073901625185, 
    -0.66371950666590918, 
    1.3690619178580901, 
    -0.39735169991907082]] 

这突出地转换为JSON,我将它转换成一个字符串在这里做的:

json.dumps(list(list(r) for r in a)) 

这给(串)产生

'[[1.2406454087805279, 0.97989932000522928, -0.84691669720415574, -0.27318907894171163, 1.219541337120247], [-1.3017272505660062, 0.41261503624079976, 1.3989584188044133, 0.75260257672408482, -1.3474929807527067], [-0.38415007296182629, -0.56925320938196644, -1.5920220380072485, 1.2990029230603588, 1.9135727724853433], [1.0625453748520415, 2.7570073901625185, -0.66371950666590918, 1.3690619178580901, -0.39735169991907082]]' 

您可以检查的结果是正确的通过重构列表并将其与数组进行比较(因为参数之一是numpy数组,所以比较是按元素进行的):

s = json.dumps(list(list(r) for r in a)) 
lofls = json.loads(s) 
lofls == a 

array([[ True, True, True, True, True], 
     [ True, True, True, True, True], 
     [ True, True, True, True, True], 
     [ True, True, True, True, True]], dtype=bool) 

我理解你的问题吗?