首页 > 解决方案 > Python 数据和矩阵

问题描述

我创建了一个 5 x 5 矩阵,如下所示:

a = [[0 for y in range(5)] for x in range(5)]
print(a)

我有一个文件 input.dat

1 2 NA
1 4 6
1 5 1
2 3 NA
3 3 10
4 5 5

使用这个文件,我需要填充我的矩阵,这样如果第 3 列的值小于或等于 5,矩阵输入的值应该为 1。矩阵应该是对称的,这意味着可以交换第一列和第二列(1,3) = (3,1)。如果值为 NA,则该值应保持为零。如果没有对,则该值应保持为零(例如,所示矩阵中的 (1,3) 为零。最终产品应如下所示:

[[0, 0, 0, 1, 0]
 [0, 0, 0, 0, 0]
 [0, 0, 1, 0, 0]
 [1, 0, 0, 0, 1]
 [0, 0, 0, 1, 0]]

非常感谢您的时间和提前帮助!

标签: pythonmatrix

解决方案


使用这样的循环:

index =   [(1, 2), (1, 4), (1, 5), (2, 3), (3, 3), (4, 5)]
condition = ['Na', 6, 1, 'Na', 10, 5]
for i in range(len(index)):
    if condition[i] != 'Na' and condition[i] <= 5:
            m, n = index[i][0] - 1, index[i][1] - 1
            a[m][n] = 1
            a[n][m] = 1

你可以得到以下结果

[[0, 0, 0, 0, 1],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 1],
 [1, 0, 0, 1, 0]]

您提供的解决方案有误。(1, 4) <= 5 --> False --> a[1, 4] = 0应该是这样。


这是使用pandas读入的数据。

import pandas as pd
data = pd.read_csv('input.dat', sep=' ')
data.Na = data.Na.apply(lambda x: int(x) if not x == 'Na' else 0)

for i in range(len(data)):
    if data.Na[i] != 'Na' and data.Na[i] <= 5:
            m, n = data.iloc[i, 0] - 1, data.iloc[i, 1] - 1
            a[m][n] = 1
            a[n][m] = 1

也提供了解决方案:

a =
[[0, 0, 0, 0, 1],
 [0, 0, 1, 0, 0],
 [0, 1, 0, 0, 0],
 [0, 0, 0, 0, 1],
 [1, 0, 0, 1, 0]]

推荐阅读