配列のきれいな文字列表現を取得しようとしていて、文字列配列型を使用しても目的の表現が得られない場合は、メッセージのシリアル化形式を使用する必要はありません。シリアル化フォーマットは、データを保存/送信するためのものです。Jsonは、人間が読める形式であることが多いという点で優れていますが、それは目的ではなく、別の形式に強制すると、jsonのシリアル化ではなくなります。savetxtおよびloadtxtnumpyオプションでさえ、必要なフォーマットでは機能しません(各列の最初の行を繰り返します)。次のコードを使用して、その形式にする必要がある場合は、独自のシリアル化を行うことができます。
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
したがって、dumpsおよびloadsコマンドは次のようになります。
strRep = json.dumps(arrayToTuple(arr))
arrayFromTuple(json.loads(strRep))
また、これはmsgpack.dumpsおよびmsgpack.loads(より高速でよりコンパクトなバイナリ表現)でも機能します。
配列に適用される可能性のある警告:numpy配列がオブジェクトdtypeの場合、標準メソッドでは完全配列としてシリアル化されません。配列に格納されているのはデータではなくオブジェクトIDであるため、各オブジェクトを個別にシリアル化する必要があります。dtypeをdtype='|S'として使用します。ここで、は最大文字列長であり、配列はシリアル化可能になります。