我想从三列文件创建一个矩阵。 我确信这是非常容易的,但我只是不明白它是如何完成的。请温柔,我是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
答案 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
评估为0
,idy
评估为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()])