【问题标题】:How to form a matrix from one column in a file?如何从文件中的一列形成矩阵?
【发布时间】:2022-01-07 13:58:05
【问题描述】:

我有一个包含此信息列的文件

1.0000000000000002
0.6593496737729044
1.0000000000000002

我可以从文件中读取这些数据,我想从中形成一个 2*2 的矩阵。我尝试了很多,但我得到了错误的输出。

my code 
with open("final_overlap.txt", "r") as final_over:
    for i in range(2):
        for j in range(2):
                    i = final_over.readline()
                    j = final_over.readline()
                    S = np.array([i,j])
                    print(S)

     The output I want like this.
        
            [[1.0000000000000002   0.6593496737729044]
             [0.6593496737729044   1.0000000000000002]]


How can I form this matrix.

Take into account that I have another input, and it has more info, so I want a method that can form a different matrix not only 2*2.
Like this input too

  

        1    1      1.0000000000000002
        2    1      0.6593496737729044
        2    2      1.0000000000000002
        3    1      0.1192165290691592
        3    2      0.0954901018165798
        3    3      1.0000000000000002
        4    1      0.0954901018165798
        4    2      0.1192165290691592
        4    3      0.6593496737729044
        4    4      1.0000000000000002

and the matrix will be 4*4

关于矩阵的另一个问题。我得到了正确的答案,但如果我有这样的输入。 `

    1    1    1    1      0.7746059439198979
    2    1    1    1      0.4441350695399573
    2    1    2    1      0.2970603935859659
    2    2    1    1      0.5696940113278337
    2    2    2    1      0.4441350695399575
    2    2    2    2      0.7746059439198979

我尝试使用此代码,但出现错误“列表索引超出范围”

for line in open('Two_Electron.txt'):
    r,c,d,e,v = line.split()
    r = int(r)-1
    c = int(c)-1
    d = int(d)-1
    e = int(e)-1    
    v = float(v)
    if c == 0:
        data.append( [v] )
    else:
        data[-1].append(v)

print(data)

# Fill in the upper triangle.

for i in range(len(data)-1):
    for j in range(i+1,len(data)):
        data[i].append( data[j][i] )
        for k in range(len(data)-1):
            for l in range(k+1,len(data)):
                data[k].append( data[l][k] )

V_ee = np.array(data)

我应该得到的输出。

 [[[[0.77460594 0.4441351 ]
   [0.4441351  0.56969403]]

  [[0.4441351  0.29706043]
   [0.29706043 0.4441351 ]]]


 [[[0.4441351  0.29706043]
   [0.29706043 0.4441351 ]]

  [[0.56969403 0.4441351 ]
   [0.4441351  0.77460594]]]]

【问题讨论】:

  • 您对这个问题的描述很糟糕。显然,您在这里拥有的是一个下三角矩阵。您希望上三角为零,还是真的希望它是下三角的反射?
  • @TimRoberts 不,我有我在帖子中添加的最后一个输入,其中第一列和第二列是我想要形成的矩阵的索引,但正如你在输入中看到的那样,并非所有元素都写入输入,因为某些值与 2,1 索引 == 1,2 索引相同,所以我想做一个循环或代码,可以形成一个矩阵,无论大小是多少
  • 但是,你看,不仅仅是“不是所有的元素都写好了”。这是一种非常特殊的格式。您在主对角线上有 1。对角线以下的所有元素都存在,对角线以上的所有元素都不存在。那是一个“下三角矩阵”。我假设您只希望下三角形穿过对角线反射到上三角形,这就是我在下面所做的。
  • @TimRoberts 没错。现在是正确的。这就是我想要的非常感谢您
  • @TimRoberts。对此感到抱歉。我在帖子中做了另一个编辑。你能看出我的错误是什么吗?提前谢谢你。

标签: python arrays matrix


【解决方案1】:

将数据加载到一个简单的列表中,然后从列表中构建行。

with open("final_overlap.txt", "r") as final_over:
    data = [float(line) for line in final_over]

S = np.array( [data[0:2], data[1:]] )
print(S)

输出:

[[1.         0.65934967]
 [0.65934967 1.        ]]

跟进

好的,假设您的数据像第二个示例一样具有行号和列号,这将读取数据,填充上三角形,然后转换为 np.array。

import numpy as np

# Read in the data to find out the size.

data = []

for line in open('x.txt'):
    r,c,v = line.split()
    r = int(r)-1
    c = int(c)-1
    v = float(v)
    if c == 0:
        data.append( [v] )
    else:
        data[-1].append(v)

# Fill in the upper triangle.

for i in range(len(data)-1):
    for j in range(i+1,len(data)):
        data[i].append( data[j][i] )

array = np.array(data)
print(array)

输出:

[[1.         0.65934967 0.11921653 0.0954901 ]
 [0.65934967 1.         0.0954901  0.11921653]
 [0.11921653 0.0954901  1.         0.65934967]
 [0.0954901  0.11921653 0.65934967 1.        ]]

即使您没有行号和列号,仍然可以这样做,只需保留一个内部计数器。

【讨论】:

  • 但是有没有其他方法可以依赖于数组的形状,因为我不仅有矩阵 2*2,而且还有 4*4 和 8*8 用于不同的数据。
  • 如果您可以在帖子中看到编辑。
猜你喜欢
  • 2016-10-09
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
相关资源
最近更新 更多