从文本文件创建矩阵-python

2024-09-27 21:32:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从一个三列文件创建一个矩阵。 我相信这是一件非常容易的事情,但我只是不明白该怎么做。请温柔一点,我是Python初学者。 谢谢你

输入文件的格式

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

期望输出-完整矩阵

  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

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

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

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

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() 

Tags: inforoutputdatanamesvaluenpline
3条回答

你可以用这个图书馆 http://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.html

你只需要做适当的调整。

希望有帮助。

尝试:

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.]])

虽然已经有一个公认的答案,但它使用熊猫。获得相同效果但不使用附加库的一种相对通用的方法是:(使用numpy是因为OP指定了numpy,但是可以使用list实现相同的效果)

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将自己限制在没有特殊字符的英语字母表(觉嫱嫱嫱嫱嫱嫱嫱嫱嫱°e等)。

我们从字母表中创建一个列表,以便可以使用index方法来检索索引值。一、 e.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的计算结果是0,而idy的计算结果也是0。然后matrix[0,0]成为值tmp[2],即4。按照“B”的相同逻辑,我们得到matrix[0,1]=5。等等。

更普遍的情况是将matrix = np.zeros((3, 3))声明为matrix = np.zeros((26, 26)),因为英语字母表中有26个字母,OP不必只使用“ABC”,而是可能使用整个范围A-Z

上层程序的输出示例如下:

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

相关问题 更多 >

    热门问题