在Python 3.4

时间:2015-10-02 11:07:42

标签: python arrays list matrix

我需要从下面的文件中创建一组矩阵,具有相同Z值的行/行将一起放在矩阵中。

以下是我的txt文件的缩短版本:

X  Y    Z
-1 10   0
1  20   5
2  15   10
2  50   10
2  90   10
3  15   11
4  50   11
5  90   11
6  13   14
7  50   14
8  70   14
8  95   14
8  75   14

例如,我的第一个矩阵将是

 [-1, 10, 0], 

我的第二个将是

[1, 20, 5], 

我的第三个将是

([2, 15, 10],
 [2, 50, 10],
 [2, 90, 10]) etc

我已经看了几个与此相关的问题,但似乎没有什么是正确的。

我开始把每一列都变成一个数组。我在想一个for循环可能效果很好。到目前为止我已经

f = open("data.txt", "r")
header1 = f.readline()
for line in f:
    line = line.strip()
    columns = line.split()
    x = columns[0]
    y = columns[1]
    z = columns[2]
i = line in f
z.old = line(i-1,4)
i=1
for line in f:
    f.readline(i)
    if z(0) == [i,3]:
       line(i) = matrix[i,:]
    else z(0) != [i,3]:
         store line(i) as M
         continue
    i = i+1

但是,我为行获得了'无效语法',

else z(0) != line(4):

通过这个else子句,我的意思是if z(0)/(z initial) is not equal to line(4)然后这一行将被存储为我们将在此代码下检查的下一个矩阵的第一行。

但是,我不确定这会有多好用。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

以下内容适用于您的数据,它假定文本文件中的列以制表符分隔:

import csv
import operator

with open('input.txt', 'rb') as f_input:
    csv_input = csv.reader(f_input, delimiter='\t')
    headers = next(csv_input)
    row_number = 1

    for k, g in itertools.groupby(csv_input, key=operator.itemgetter(0)):
        row = []
        for entry in g:
            entry = [float(e) for e in entry]
            row.append([row_number] + entry)
            row_number += 1
        print row

这将打印以下输出:

[[1, -1, 10, 0]]
[[2, 1, 20, 5]]
[[3, 2, 15, 10], [4, 2, 50, 10], [5, 2, 90, 10]]
[[6, 3, 15, 11]]
[[7, 4, 50, 11]]
[[8, 5, 90, 11]]
[[9, 6, 13, 14]]
[[10, 7, 50, 14]]
[[11, 8, 70, 14], [12, 8, 95, 14], [13, 8, 75, 14]]

如果您的CSV文件与您显示的完全一致,即空格将列分开,则您需要更改csv.reader行,如下所示:

csv_input = csv.reader(f_input, delimiter=' ', skipinitialspace=True)

答案 1 :(得分:1)

以下更简单的代码可以满足您的需求:

import numpy as np

# Load the file using numpy (skip the first row which contains the header)
foo = np.loadtxt("/path/to/your/data-file", skiprows=1)

# Prepend a column with the row number
first_col = np.arange(foo.shape[0]) + 1  # +1 because we don't want to start with 0
bar = np.hstack((first_col[:, None], foo))

您现在可以通过bar[0], bar[1], ...

访问单行