1

temp.txt ファイルの例:

File: t091110_065921.SFTC Src: J1903+0925 Nsub: 1 Nch: 1 Npol: 4 Nbin: 1024 RMS: 0.00118753
0 0 0 0.00148099 -0.00143755 0.000931365 -0.00296775
0 0 1 0.000647476 -0.000896698 0.000171287 0.00218597
0 0 2 0.000704697 -0.00052846 -0.000603842 -0.000868739
.
.
等..

ありがとうございました!


これがどのように生成されたかに応じて、次のコードを使用しました。

for i in range(numrows):
    epoch_name = y['filename'][i]
    os.system('pdv -t {0} > temp.txt '.format(epoch_name))
    stokes_line = np.genfromtxt('temp.txt', usecols=3, dtype=[('stokesI','float')], skip_header=1)
    stokes_list.append(stokes_line)
stokes_columns = zip(*stokes_list)

そのため、「pdv」コマンドで他のソフトウェアを使用して、プログラムがループするたびに (テキスト ファイルに) 値のグリッドを生成しています。次に、このテキスト ファイルから特定の列を 1 つ取り出して、「stokes_list」に追加します。最後に、列が行になるように配列 (またはそれが何であれ) を転置します。


私はPythonで、次のようなリストのリスト(または任意の配列、用語を本当に理解していません)を持っています:

[((1,)(2,)(3,)),((4,)(5,)(6,)),((7,)(8,)(9,))]

まず、角括弧内の角括弧ではなく、角括弧内に括弧が含まれている理由がわかりません。第二に、数字の後にコンマがあり、数字自体が括弧で囲まれている理由がわかりません。とにかく、これに答えるには、おそらくより多くのコンテキストが必要です。しかし、私の本当の問題は、これを次の形式でファイルに書き込もうとしていることです。

1   2   3  
4   5   6  
7   8   9  

やっています:

with open('final.txt','w') as f:
    for row in stokes_columns:
        f.write('\t'.join(row)+'\n')

「stokes_columns」は、上部にある配列/リストの名前です。

エラーメッセージが表示されます:

f.write('\t'.join(row)+'\n')
TypeError: sequence item 0: expected string, numpy.void found

誰でもこれで私を助けてもらえますか?

4

5 に答える 5

2

join文字列の配列が必要です。3 行目は次のようになります。

f.write('\t'.join(str(cell) for cell in row)+'\n')

必要に応じて、すべてを 1 つのステートメントで実行できます。

f.write('\n'.join(
    '\t'.join(str(cell) for cell in row)
    for row in stokes_columns
))
于 2012-09-06T06:47:03.267 に答える
2

これは、numpy 行列を作成または転置する方法ではありません (特に、numpy 行列ではないため、numpy ベクトルの通常のリストです)。次のことを試してください。

stokes_list = np.array([])
for i in range(numrows):
    epoch_name = y['filename'][i]
    os.system('pdv -t {0} > temp.txt '.format(epoch_name))
    stokes_line = np.genfromtxt('temp.txt', usecols=3, dtype=[('stokesI','float')], skip_header=1)
    stokes_list = vstack(stokes_list, stokes_line)

stokes_columns = np.transpose(stokes_list)
于 2012-09-06T07:03:52.157 に答える
2

指定したリストの代わりに(本来あるべきものではないと思います)

だと仮定して[((1,),(2,),(3,)),((4,),(5,),(6,)),((7,),(8,),(9,))]

以下はある程度あなたを助けるはずです

最終出力を取得したら、それを使用して行にプッシュできます

In [74]: str = [((1,),(2,),(3,)),((4,),(5,),(6,)),((7,),(8,),(9,))]

In [75]: str2 = []

In [76]: for elem in str:
   ....:     str2.append([data[0] for data in elem])
   ....:

In [77]: str2
Out[77]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [78]: for elem in zip(*str2):
   ....:     print elem
   ....:
(1, 4, 7)
(2, 5, 8)
(3, 6, 9)

OPの最後の編集に従って、出力を変更しました:

In [92]: for elem in str2:
   ....:     print elem
   ....:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
于 2012-09-06T07:04:50.787 に答える
2

タプルのリストを書き込もうとしているのではなく、柔軟なデータ型を持つ numpy 配列を書き込もうとしています (voidこの場合は、に応じてTypeError)。柔軟な dtype には事前定義されたサイズがないため、保存する前に、配列の格納に使用する dtype を決定する必要があります。たとえば、データを int16 として保存する場合は、次のようにします。

your_array.astype('int16').tofile(filename)

うまくいくはずだと思います。

于 2012-09-06T07:12:23.137 に答える
0

tofile()関数は、すべての項目を(マシン値として)ファイルオブジェクトに書き込みます。たぶんsavetxt()、ASCIIファイルの正しい関数です

于 2012-11-24T20:52:10.840 に答える