如何将numpy浮点数组序列化为字符串?

时间:2016-03-31 18:55:41

标签: javascript python numpy

我有一个巨大的numpy数组浮点数,比如〜1500 * 2500px我想要

  1. 将此数组转换为list(如javascript)(例如[[0.1,0.3,0.2],[0.1,0.3,0.2]]
  2. 将其序列化为字符串,以便向服务器发送POST请求。
  3. 我不知道该怎么做(1)。对于(2),我查看了numpy.array_str()array2string()array_repr()函数,它们返回数组的表示形式,但不返回完整数组。

    我该怎么做?

2 个答案:

答案 0 :(得分:1)

我不确定你为什么要它"这个数组要[看起来像?]像一个JavaScript数组,所以我假设(因为我可以在没有相反信息的情况下做到这一点) )您希望将阵列传达给一些不幸的前端进程:近四百万个元素仍然是大量数据,可以跨越网络管道。因此,与往常一样,问题的某些背景将是有帮助的(您可以编辑您的问题以提供它)。

假设您想序列化数据以进行传输或存储,那么最简单的方法是将其呈现为JavaScript可理解的字符串(我没有知道" [看起来像?]和#34;意味着什么)正在使用json标准库。由于这不能对除了int,浮点数,真值和字符串的列表和序列之外的任何内容进行本地编码,因此您仍然面临着如何最好地将矩阵表示为列表列表的问题。

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

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

这不能直接用JSON表示:

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

导致相当冗长(它可能只是调用对象' s 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)

我是否正确理解了您的问题?

答案 1 :(得分:-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.17244659329654555,0.3530236209359401,0.2081303162461341],[0.9186758779272243,0.9300730012004015,0.14121513893149895,0.39315493832613735]]