从文本文件 - python创建矩阵

时间:2015-05-11 10:53:22

标签: python matrix

我想从三列文件创建一个矩阵。 我确信这是非常容易的,但我只是不明白它是如何完成的。请温柔,我是python的初学者。 谢谢

输入文件的格式

  A B C
A 5 4 3
B 4 2 1
C 3 1 0

期望的输出 - 完整矩阵

  A B C
A 5 4 3
B   2 1
C     0

或 - 半矩阵

import numpy as np

for line in file('test').readlines():
    name1, name2, value = line.strip().split('\t')

a = np.matrix([[name1], [name2], [value]])
print a

我试过这个,但正如我所说,我对python和编程非常陌生。

data = {}
names = set([])

for line in file('test').readlines():
    name1, name2, value = line.strip().split('\t')
    data[(name1, name2)] = value
    names.update([name1])

names = sorted(list(names))
print  names
print data

output = open('out.txt', 'w')

output.write("\t%s\n" % ("\t".join(names)))
for nameA in names:
    output.write("%s" % nameA)
    for nameB in names:
        key = (nameA, nameB)
        if key in data:
            output.write("\t%s" % data[(nameA, nameB)]) 
        else:
            output.write("\t")  
    output.write("\n")


output.close() 

工作脚本 - 我的一位朋友也帮助了我,所以如果有人对一个更简单的脚本感兴趣,那么就是这样。它不是最有效的,但效果很好。

<select id="Units">
   <option value="Marketing" > Marketing </option>
   <option value="Finance" > Finance </option>
   <option value="Operations" > Operations </option>
</select>
<input type="checkbox"  class="enable" onclick="check();" value="1"> chbx1
<input type="checkbox"  class="dissable" onclick="check();" value="2"> chbx2
<input type="checkbox"  class="dissable" onclick="check();" value="3"> chbx3
<input type="checkbox"   class="enable" onclick="check();" value="4"> chbx4

4 个答案:

答案 0 :(得分:3)

尝试:

import pandas as pd
import numpy as np

raw = []
with open('test.txt','r') as f:
    for line in f:
        raw.append(line.split())
data = pd.DataFrame(raw,columns = ['row','column','value'])
data_ind = data.set_index(['row','column']).unstack('column')
np.array(data_ind.values,dtype=float))

输出:

array([[ 5., 4., 3.], [ nan, 2., 1.], [ nan, nan, 0.]])

答案 1 :(得分:3)

虽然已经有一个已接受的答案,但它使用了熊猫。获得相同效果但不使用额外库的相对通用的方法是:(使用numpy因为OP指定了numpy,但是你可以用列表实现相同的功能)

import string
import numpy as np

up = string.ascii_uppercase
uppercase = list()
for letter in up:
    uppercase.append(letter)

file = open("a.txt")

matrix = np.zeros((3, 3))

for line in file.readlines():
    tmp = line.strip()
    tmp = tmp.split(" ")
    idx = uppercase.index(tmp[0])
    idy = uppercase.index(tmp[1])
    matrix[idx, idy] = tmp[2]

想法是你收集所有字母的字母,希望OP将自己限制在只有英文字母而没有特殊的字符(šđćžčę°等等......)。

我们从字母表中创建一个列表,以便我们可以使用index方法来检索索引值。即uppercase.index("A")0。我们可以使用这些索引来填充我们的数组。

逐行读入文件,删除多余的字符,按空格分割得到:

['A', 'A', '5']
['A', 'B', '4']

现在这是实际的工作部分:

    idx = uppercase.index(tmp[0])
    idy = uppercase.index(tmp[1])
    matrix[idx, idy] = tmp[2]

即。对于字母“A”,idx评估为0idy评估为matrix[0,0]。然后tmp[2]变为值4 matrix[0,1]=5。按照“B”的相同逻辑,我们得到matrix = np.zeros((3, 3))。等等。

更普遍的情况是将matrix = np.zeros((26, 26))声明为>>> matrix array([[ 5., 4., 3.], [ 0., 2., 1.], [ 0., 0., 0.]]) ,因为英文字母中有26个字母而OP不必仅使用“ABC”,但可能会使用整个范围AZ。

上层程序的示例输出为:

Sub ertdfgcvb()
Dim myArray(5, 3)
For Row = 0 To 4
    For col = 0 To 2
        myArray(Row, col) = Row * col
    Next
Next
Dim rng As Range
Set rng = Range("A1")
For i = LBound(myArray, 1) To UBound(myArray, 1)
    For j = LBound(myArray, 2) To UBound(myArray, 2)
        rng.Offset(i, j) = myArray(i, j)
    Next
Next
End Sub

答案 2 :(得分:2)

您可以使用此库 http://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.html

您只需进行适当的调整即可。

希望它有所帮助。

答案 3 :(得分:1)

你的矩阵似乎重新生成图的邻接矩阵。

我发现熊猫的答案更加简洁优雅。 这是我的尝试,没有添加大熊猫作为额外的依赖。

<!-- language: python -->
f = open('.txt', 'r');

EdgeKey = namedtuple("EdgeKey", ["src", "dst"])

g = dict()
for line in f:

    elems = line.split(' ');
    key = EdgeKey(src=elems[0], dst=elems[1])
    g[key] = elems[2]
    key_rev = EdgeKey(src=elems[1], dst=elems[0]) # g[A, B] == g[B, A]
    g[key_rev] = elems[2]

vertices = set()
for src, dst in g.keys():
    vertices.add(src)
    vertices.add(dst)

vertices = list(vertices)
vertices.sort()

# create adjacency matrix
mat  = np.zeros((len(vertices), len(vertices)))
for s, src in enumerate(vertices):
    for d, dst in enumerate(vertices):
        e = EdgeKey(src=src, dst=dst)
        if e in g:
            mat[s, d] = int(g[e])

# print adjacency matrix
print ' ' , ' '.join(vertices) # print header
for i, row in enumerate(mat):
    print vertices[i], ' '.join([str(int(c)) for c in row.tolist()])