【问题标题】:How to populate 2D array from the file如何从文件中填充二维数组
【发布时间】:2015-11-20 23:03:06
【问题描述】:

我有一个文件,每行一个参数:

a1
b1
c1
a2
b2
c2
...

参数是字符行(不是数字)

我需要将其加载到 2D 数组以进行进一步操作。 到目前为止,我设法将此文件上传到一维数组中:

ParametersRaw = []
with open(file1) as fh:
    ParametersRaw = fh.readlines()
fh.close()

NumberOfColumns = 7
NumberOfRows = len(ParametersRaw)/NumberOfColumns

Parameters = [[],[]]
i=0
j=0
k=0
while (i < NumberOfRows):
    while (j < NumberOfColumns):
        k = (i*NumberOfColumns)+j
        Parameters[i][j] = ParametersRaw[k]
        j = j + 1
    i = i + 1
    j = 0

它在Parameters[i][j] = ParametersRaw[k] 行失败并出现错误:

IndexError:索引 0 超出轴 0 的范围,大小为 0

如果填充一维数组,我会使用 append() 方法。 但是在 2D 的情况下,我不知道如何应用 append()。

狮子座

【问题讨论】:

  • 如果你提供一个你想要得到的二维数组的样本会很有帮助

标签: python arrays multidimensional-array


【解决方案1】:

我不知道这是否回答了你的问题,但如果你从

parameters = [[''], ['']]

然后

parameters[0][0]

''

Parameters = [[],[]] 你所拥有的是一个包含两个空列表的列表。由于这些列表是空的,因此您无法对它们进行索引。

【讨论】:

  • i == 1j == 1 时呢?或任何时间i &gt; 0 or j &gt;0
  • @R Nar 的答案更好:)
【解决方案2】:

您仍然可以使用 append,但您必须先为每个值启动空列表。

>>> NumberOfRows = 5
>>> [[] for __ in range(NumberOfRows)]
[[], [], [], [], []]

然后您可以在每个项目上调用append

parameters = [[] for __ in range(NumberOfRows)]
for i in range(0,NumberOfRows,NumberOfColumns):
    for j in range(NumberOfColumns):
        k = i+j
        Parameters[i//NumberOfColumns].append(ParametersRaw[k])

请记住 range(0,NumberOfRows,NumberOfColumns): 的使用,这与迭代 i+=NumberOfColumns 直到 i &gt;= NumberOfRows 相同

我希望这能如你所愿!我无法测试它,因为我没有你的任何数据,所以如果有问题,请发表评论:)

【讨论】:

    【解决方案3】:

    谢谢大家。这是给我带来这么多麻烦但现在按我想要的方式工作的最后一段代码:

    fRawData = []
    with open(fStagingFile2) as fStagingFile2FH:
        fRawData = [line.strip() for line in fStagingFile2FH.readlines()]   # This is to read each element from the file and chop off the end of line character
    
    fNumberOfColumns = 7
    fNumberOfRows = len(fRawData)/fNumberOfColumns
    
    fRowID = 0
    fParameters = []
    for fRowID in range(0, len(fRawData), fNumberOfColumns):
        fParameters.append(fRawData[fRowID:fRowID+fNumberOfColumns])    # This is to convert 1D array to 2D
    
    # and down below section is an example of how to read each element of the list
    # and how to update it if I need so.
    fRowID = 0
    fColumnID = 0
    for fRowID in range(fNumberOfRows):
        for fColumnID in range(fNumberOfColumns):
            if fColumnID == 0:
                fParameters[fRowID][fColumnID] = "XXXX"
            Message2Log("fParameters[" + str(fRowID) + "][" + str(fColumnID) + "] = " + str(fParameters[fRowID][fColumnID]))
    

    CU

    【讨论】:

      【解决方案4】:

      如果参数列表的大小是numCols的倍数,那么使用numpy只需几行代码即可完成。

      import numpy as np
      parameters = np.loadtxt("./filename.txt", unpack=True, dtype=str)
      numCols = 7
      numRows = len(parameters) / numCols
      parameters = np.reshape(parameters, (numRows, numCols))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-27
        • 1970-01-01
        相关资源
        最近更新 更多