2017-07-15 75 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我认为代码很简单,不言而喻。但是,如果您无法理解其中的任何部分,请在此发布具体问题,我会尽力解决它。 –