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

Javascript 如何将浮点数数组序列化为字符串?,javascript,python,numpy,Javascript,Python,Numpy,我有一个巨大的浮点数阵列,比如说~1500*2500px,我想 将此数组转换为列表(如javascript)(例如[[0.1,0.3,0.2],[0.1,0.3,0.2]) 将其序列化为服务器POST请求的字符串 我不知道该怎么做。对于(2)我查看了numpy.array_str()、array2string()和array_repr()函数,它们返回数组的表示形式,但不返回完整数组 我应该怎么做?您可以将其转换为普通python列表,然后再转换为字符串 arr = np.random.rand

我有一个巨大的浮点数阵列,比如说~1500*2500px,我想

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


    我应该怎么做?

    您可以将其转换为普通python列表,然后再转换为字符串

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

    [0.7998950511604668,0.3504357174428122,0.451632676829708,0.4209055617799977],[0.5151954869755273,0.7101183117731774,0.953057543271824,0.3986976095464],[0.20318293100519536,0.172446659329654555,0.3530236209359401,0.2081303162461341],[0.9186758727243,0.930073001393155]


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

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

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

    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))
    
    它给出了(字符串)结果

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


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

    您期望的字符串是什么?python对象的默认字符串表示形式对于序列化来说是一种不稳定的选择。
    json.dumps
    将提供一种更稳定的方法,尽管目前它会产生相同的结果。
    '[[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]]'
    
    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)