2017-07-15 77 views
1

我有一個簡單的代碼,其想法是打開一個六列文件,選擇一列並保存。我面臨的問題是我不斷獲得水平排列的數據。當我試圖調換他們,我得到了一個更奇怪的輸出,看起來像轉置水平數據並保存它們

[number1, number2, number3, ..., number4, number5, number6] 

雖然有一列中的一個萬點。我怎樣才能解決這個問題?

import numpy as np 

filename = "C:\\Users\\blablabla.dat" 
col_sep = "\t" 

col_1 = [] 

with open(filename,'r') as f: 
    for line in f: 
     if line[0] != "#": 
      linedata = [float(line.split(col_sep)[i]) for i in range(len(line.split(col_sep)))] 
      col_1.append(linedata[4]) 

tr = np.transpose(col_1) 

s = str(tr) 
c = open("C:\\Users\\blablabla1.dat", "w") 
c.write(s) 
c.close() 

回答

0

因此,您試圖從文件中提取一列並將其保存到另一個文件?

這應做到:

filename = "C:\\Users\\blablabla.dat" 
col_sep = "\t" 

col_1 = [] 
with open(filename, 'r') as f: 
    for line in f: 
     if line[0] != "#": 
      col_1.append(float(line.split(col_sep)[4])) 

with open("C:\\Users\\blablabla1.dat", "w") as f: 
    for val in col_1: 
     f.write("%f\n" % val) 

list在你的程序中調用col_1不附帶任何方向,它既不水平,也不是垂直的;它只是一個值的列表。您正在使用特定列中的值填充它,逐行讀取文件並手動解析。要將其保存爲列,您必須以相同的方式迭代它,並且每行寫入一個值。

此外,只是爲了揭祕發生了什麼; np.transpose對您的一維數據沒有任何影響,只是將np.array(矢量)與list中的數據一起返回。 str,返回的是您寫入輸出文件的array的可讀字符串表示形式。

+0

謝謝,原來如此!我看到你的方法很簡單直接。你能解釋爲什麼轉座不起作用嗎? – DenGor

+0

'轉置'開關軸;如果只有一個軸,則切換它不執行任何操作。 – hpaulj

0

代替使用np.transpose(這是一個無操作用於1D數據),你可以簡單地將其轉換爲一個陣列中後添加維度的:

tr = np.array(col_1)[:, None] # instead of "tr = np.transpose(col_1)" 

例如:

>>> np.array([1,2,3,4,5,6])[:, None] 
array([[1], 
     [2], 
     [3], 
     [4], 
     [5], 
     [6]]) 

有有幾種其他方法可以改善你的代碼,但這種改變應該能解決這個問題。 :)

例如numpy.loadtxt可以用來以更直接的方式來提取柱:

# to extract the fifth column of a csv file: 
tr = np.loadtxt(filename, delimiter=col_sep, comments='#')[:, 4][:, None] 
+0

謝謝,這個作品也是!該列表現在可以轉置。 – DenGor

+0

@DenGor沒問題。請不要忘記[upvote](https://meta.stackexchange.com/questions/173399/how-to-upvote-on-stack-overflow)所有有用的答案。 – MSeifert

0

file.write('\n'.join([str(_) for _ in col_1]) + '\n')可以爲你工作。

順便說一下numpy.ndarray對象不能直接寫入文件,而是嘗試numpy.savetxt()

0

使用numpy.loadtxt()讀取整個輸入表爲numpy數組,然後在不同的輸出文件中使用numpy.savetxt欄目保存單個列,例如:

import numpy as np 
data = np.loadtxt(filename).T 
output_filenames = ['file1.txt', 'file2.txt', 'file3.txt', ...] # add 3 more names 
for col, fn in zip(data, output_filenames): 
    np.savetxt(fn, col) 
+0

儘管此代碼可能會回答這個問題,但提供關於此代碼爲何和/或如何回答問題的其他上下文可提高其長期價值。 –

+0

你不應該刪除它,你應該編輯它來添加一些解釋。 –

+0

@DonaldDuck我認爲代碼很簡單,不言而喻。但是,如果您無法理解其中的任何部分,請在此發佈具體問題,我會盡力解決它。 –