我有一个简单的代码,其想法是打开一个六列文件,选择一列并保存。我面临的问题是我不断获得水平排列的数据。当我试图转置它们时,我得到了一个更奇怪的输出,看起来像
[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 :(得分:0)
那么,您是尝试从文件中提取一列并将其保存到另一个文件中?
这应该这样做:
=SWITCH(
Fields!Factors.Value = "Touched Leads", "SCPL",
Fields!Factors.Value = "TOTAL", "Disposition",
True, Nothing
)
程序中名为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)
的{{1}}没有附加方向,既不是水平的,也不是垂直的;它只是一个值列表。您使用特定列的值填充它,逐行读取文件并手动解析。要将其保存为列,您必须以相同的方式迭代它并为每行写入一个值。
另外,只是揭开正在发生的事情的神秘面纱; list
对您的一维数据没有任何效果,只需返回col_1
(向量)来自np.transpose
的数据。 np.array
上的list
返回了一个人类可读的字符串表示形式str
,您将其写入输出文件。
答案 1 :(得分: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]
答案 2 :(得分:0)
file.write('\n'.join([str(_) for _ in col_1]) + '\n')
可能适合您。
顺便说一句numpy.ndarray
个对象无法直接写入文件,请尝试使用numpy.savetxt()
。
答案 3 :(得分: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)