我有花车的巨大numpy的阵列,说〜1500 * 2500px,我想如何序列化一个浮点数的浮点数到一个字符串?
- 转换这个数组的
list
(如JavaScript)(例如[[0.1,0.3,0.2],[0.1,0.3,0.2]]
) - 它序列化到一个字符串POST请求到服务器。
我不知道该怎么办(1)。对于(2)我看了numpy.array_str()
,array2string()
和array_repr()
函数,它们返回数组的表示而不是整个数组。
我该怎么做?
我有花车的巨大numpy的阵列,说〜1500 * 2500px,我想如何序列化一个浮点数的浮点数到一个字符串?
list
(如JavaScript)(例如[[0.1,0.3,0.2],[0.1,0.3,0.2]]
)我不知道该怎么办(1)。对于(2)我看了numpy.array_str()
,array2string()
和array_repr()
函数,它们返回数组的表示而不是整个数组。
我该怎么做?
你可以将其转换为一个普通的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]]
Python对象的默认字符串表示是序列化有点挥发的选择。 'json.dumps'将提供更稳定的方法,但目前它会产生相同的结果。 –
我不确定你为什么要这样做“这个数组看起来像一个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)
我理解你的问题吗?
什么是你期望的字符串? –