【问题标题】:How to serialize a numpy array of floats to a string?如何将一个 numpy 浮点数组序列化为字符串?
【发布时间】:2016-03-31 18:55:41
【问题描述】:

我有一个巨大的 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() 函数,它们返回数组的表示,但不是完整的数组。

我应该怎么做?

【问题讨论】:

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

标签: javascript python numpy


【解决方案1】:

我不知道你为什么希望它“这个数组 [看起来?] 像一个 JavaScript 数组,所以我假设(因为我可以在没有相反信息的情况下随意做)你希望将数组传达给一些不幸的前端进程:近 400 万个元素仍然是通过网络管道喷射的大量数据。因此,与往常一样,问题的一些背景会有所帮助(您可以编辑您的问题以提供它)。

假设您想要序列化数据以进行传输或存储,那么将其呈现为 JavaScript 可理解的字符串的最简单方法(我不知道“[look?] like”是什么意思)使用json标准库。由于除了整数、浮点数、真值和字符串的列表和字典之外,它不能对任何内容进行原生编码,因此您仍然面临如何最好地将矩阵表示为列表的问题。

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

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)

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

【讨论】:

    【解决方案2】:

    下面的方法很直观。
    np.ndarray -> list -> json_str -> list -> np.array(list_obj)

    代码示例:

    import json
    import numpy as np
    
    np_arr = np.array([[1, 2], [7, 8]])
    json_str = json.dumps(np_arr.tolist())
    arr = json.loads(json_str)
    restore_np = np.array(arr)
    # True
    print((np_arr == restore_np).all())
    

    【讨论】:

      【解决方案3】:

      你可以把它转换成一个普通的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]]

      【讨论】:

      • python 对象的默认字符串表示是序列化的一个有点不稳定的选择。 json.dumps 将提供更稳定的方法,尽管目前它会产生相同的结果。
      猜你喜欢
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 2011-04-22
      • 2021-12-28
      • 2011-07-18
      • 1970-01-01
      相关资源
      最近更新 更多