web-dev-qa-db-ja.com

TypeError:配列dtype( 'object')と書式指定子( '%.18e')の不一致

私は次の配列を持っています:

X = np.array([image_array_to_vector1,image_array_to_vector2,image_array_to_vector3,image_array_to_vector4])

Xの出力は次のようになります。

[array([167, 167, 169, ...,   1,   1,   1], dtype=uint8)
 array([42, 43, 43, ..., 41, 36, 34], dtype=uint8)
 array([0, 0, 0, ..., 0, 0, 0], dtype=uint8)
 array([0, 0, 0, ..., 0, 0, 0], dtype=uint8)]

データをtxtとして保存しようとすると:

X_to_text_file = np.savetxt('x.txt',X)

私は次を取得します:

File "/Library/Python/2.7/site-packages/numpy/lib/npyio.py", line 1258, in savetxt
    % (str(X.dtype), format))
TypeError: Mismatch between array dtype ('object') and format specifier ('%.18e')

何故ですか?どうすれば問題を解決できますか?

ありがとう。

11
Simplicity

いくつかのサンプルデータなしでこれを複製するのは少し難しいですが、ここに私が思いついたものがあります。

arr = np.array([np.array([1,2,3]), np.array([1,2,3,4])])
arr
array([array([1, 2, 3]), array([1, 2, 3, 4])], dtype=object)
np.savetxt('x.txt', arr)
TypeError: Mismatch between array dtype ('object') and format specifier ('%.18e')

@Artierが指摘したように、 オブジェクト配列を.txtファイルに書き込む の受け入れられた回答の最後に小さなスニペットがあります。これは、配列をfmt='%s'。この形式を使用することで、問題を解決できるようです(ここでも、データのサンプルがないと問題を再現できません)。

np.savetxt('x.txt', arr, fmt='%s')

異なる配列を保存し、それらを保持する単一の場所が必要な場合は、 savez が非常に役立つことを指摘します。

21
Grr

本質的にsavetxtは次のことを行っています。

for row in your_array:
    print(fmt % Tuple(row))

fmtは、fmtパラメーター(またはデフォルトのパラメーター)、列数、および区切り文字で構成されます。

オブジェクト(配列)の1次元配列があります。したがって、書き込み/印刷は

 print(fmt % Tuple(element))

%sは、配列(またはその他の一般的なオブジェクト)を処理できる唯一の形式です。

savetxtは、2D数値配列で使用することを目的としています。これは、csv列を必要とする種類のものです。このオブジェクト配列のような他のものでそれを使用しようとすると、頭痛の種になります。

In [2]: A = np.empty((3,),dtype=object)
In [3]: A[:] = [np.arange(3),np.arange(1,4), np.arange(-3,0)]
In [4]: A
Out[4]: array([array([0, 1, 2]), array([1, 2, 3]), array([-3, -2, -1])], dtype=object)

In [6]: np.savetxt('test',A,fmt='%s')
In [7]: cat test
[0 1 2]
[1 2 3]
[-3 -2 -1]

1次元配列を繰り返し処理するには、Tupleをスキップする必要があります。いずれにしても、あなたができる最善の方法は%s フォーマット。それ以外の場合は、独自のカスタムファイルライターを作成します。 savetxtは特別でも強力でもありません。

In [9]: for row in A:
   ...:     print('%s'%row)  
[0 1 2]
[1 2 3]
[-3 -2 -1]
3
hpaulj

同じエラーメッセージが表示され、長さが異なる配列に問題があるように見えました。そのため、必ずnp.savetxt配列の長さを等しくする必要があります。

1
Olga