1

私は立ち往生していて(そして少し時間がかかります)、助けを期待していました。これはおそらく簡単な作業ですが、私はそれを解決できないようです。

次のようなテキストファイルの行の名前と同じ名前の名前の開始列が追加された、たとえば5x5のマトリックスがあります。

b e a d c
b 0.0 0.1 0.3 0.2 0.5
e 0.1 0.0 0.4 0.9 0.3
a 0.3 0.4 0.0 0.7 0.6
d 0.2 0.9 0.7 0.0 0.1
c 0.5 0.3 0.6 0.1 0.0

行列の形式とサイズが同じであるファイルが複数ありますが、名前の順序が異なります。これらをすべて同じにして0.0の対角線を維持するように変更する方法が必要です。したがって、列に対して行うスワッピングは、行に対して行う必要があります。

私は少し検索していて、NumPyは私が望むことをするかもしれないようですが、私はそれや一般的な配列を使ったことがありません。どんな助けでも大歓迎です!

つまり、テキストファイルを配列に入れて、行と列を希望の順序に入れ替えるにはどうすればよいですか?

4

3 に答える 3

4

パンダを使用することをお勧めします:

from StringIO import StringIO
import pandas as pd
data = StringIO("""b e a d c
b 0.0 0.1 0.3 0.2 0.5
e 0.1 0.0 0.4 0.9 0.3
a 0.3 0.4 0.0 0.7 0.6
d 0.2 0.9 0.7 0.0 0.1
c 0.5 0.3 0.6 0.1 0.0
""")
df = pd.read_csv(data, sep=" ")
print df.sort_index().sort_index(axis=1)

出力:

     a    b    c    d    e
a  0.0  0.3  0.6  0.7  0.4
b  0.3  0.0  0.5  0.2  0.1
c  0.6  0.5  0.0  0.1  0.3
d  0.7  0.2  0.1  0.0  0.9
e  0.4  0.1  0.3  0.9  0.0
于 2013-03-16T00:05:57.047 に答える
0

これが恐ろしいNumpyバージョンの始まりです(HYRYの答えを使用してください...)

import numpy as np

with open("myfile", "r") as myfile:
    lines = myfile.read().split("\n")
    floats = [[float(item) for item in line.split()[1:]] for line in lines[1:]]
    floats_transposed = np.array(floats).transpose().tolist()
于 2013-03-16T00:09:15.497 に答える
0
from copy import copy

f = open('input', 'r')
data = []
for line in f:
    row = line.rstrip().split(' ')
    data.append(row)

#collect labels, strip empty spaces
r = data.pop(0)
c = [row.pop(0) for row in data]
r.pop(0)

origrow, origcol = copy(r), copy(c)

r.sort()
c.sort()

newgrid = []
for row, rowtitle in enumerate(r):
    fromrow = origrow.index(rowtitle)
    newgrid.append(range(len(c)))
    for col, coltitle in enumerate(c):
        #We ask this len(row) times, so memoization
        #might matter on a large matrix
        fromcol = origcol.index(coltitle)
        newgrid[row][col] = data[fromrow][fromcol]

print "\t".join([''] + r)
clabel = c.__iter__()
for line in newgrid:
    print "\t".join([clabel.next()] + line)
于 2013-03-16T00:30:46.440 に答える