如果您只是想获得数组的漂亮字符串表示,并且使用字符串数组类型并不能提供您想要的表示,那么消息序列化格式不是要使用的东西。序列化格式用于保存/传输数据。Json 很好,因为它通常也是人类可读的,但这不是目的,强制将其转换为不同的格式会使其不再是 json 序列化。即使 savetxt 和 loadtxt numpy 选项也不适用于您想要的格式(重复每一列的第一行)。如果必须采用该格式,您可以使用以下代码进行自己的序列化:
def prettySerialize(inArray):
ids = inArray[0]
strRep = ''
for row in inArray[1:]:
for i,item in enumerate(row):
rowStr = id[i] + ':' + item + '\n'
strRep += rowStr
return strRep
这样做的问题是它会慢得多,并且数组的表示形式要大得多(一遍又一遍地重复“id”行)。我强烈建议您使用纯 json(或 msgpack)解决方案,除非您专门将其格式化以供人类阅读......
这是我用于使用 msgpack 进行序列化的解决方案(也适用于 json)... 转换为包含 dtype 和数组形状的元组:
def arrayToTuple(arr):
if arr is None:
return None
return (arr.dtype.str, arr.shape, arr.tostring())
def arrayFromTuple(tupl):
if tupl is None:
return None
typeStr, shape, dataStr = tupl
resultArray = numpy.fromstring(dataStr, dtype=typeStr).reshape(shape)
return resultArray
所以转储和加载命令将是:
strRep = json.dumps(arrayToTuple(arr))
arrayFromTuple(json.loads(strRep))
这也适用于 msgpack.dumps 和 msgpack.loads(一种更快更紧凑的二进制表示)。
可能适用于您的数组的警告:如果您的 numpy 数组是对象 dtype,则它不会通过标准方法序列化为完整数组。您必须单独序列化每个对象,因为它是存储在数组中的对象 ID,而不是数据。使用 dtype 作为 dtype='|S' 其中是最大字符串长度将使数组可序列化。