【问题标题】:2D array in a nested for loop in python?python中嵌套for循环中的二维数组?
【发布时间】:2015-11-24 19:44:03
【问题描述】:

我是 python 新手,一直在尝试从 excel 文件中读取数据集并将其存储在数组/列表中。

我正在使用“openpyxl”来处理 excel 文档,因此存在一些非标准语法,但是,所有这些似乎都有效,我认为问题在于二维数组位。

这可能是一个非常基本的新手错误,但由于我习惯于使用 C++ 工作,我很难弄清楚它!

(为了清楚起见,我包含了打印语句,因为这就是我试图排除故障的方式)

%matplotlib inline  
    ​  
import numpy as np  
import matplotlib.pyplot as plt  
import math as mth  
import scipy as science  
from array import array  
​  
from openpyxl import load_workbook  
wb2 = load_workbook(r'C:"path and file name"')  
ws1 = wb2.active  
​  
timeArray = [None]*630  
voltageArray = [[None]*25,[None]*630]  
i=0  
j=0  
​  
​
for i in range (0, 625):  
    j=0  
    timeArray[i] = ws1.cell(row = i+1, column = 4).value  
    for j in range (0, 15):  
        voltageArray[j][i] =(ws1.cell(row = i+1, column = j+5).value)  
        print(j, i)  
        print(voltageArray[j][i])

准确打印出来;
0 0
-30
1 0
-29
到目前为止,哪些是正确的数字,但此时它失败并给出以下错误;


IndexError                                Traceback (most recent call last)  
<ipython-input-9-fa1751a1a2f2> in <module>()  
     20     timeArray[i] = ws1.cell(row = i+1, column = 4).value  
     21     for j in range (0, 15):  
---> 22         voltageArray[j][i] =(ws1.cell(row = i+1, column=j+5).value)  
     23         print(j, i)  
     24         print(voltageArray[j][i]) 


IndexError: list index out of range

电子表格中没有任何内容会导致此问题,因为下一个单元格已填充且格式与前两个单元格完全相同。

我认为我设置或使用二维数组“voltageArray”的方式有问题

我已经从类似问题的答案中尝试了几种修复方法,但都无法使它们中的任何一个起作用。

任何帮助将不胜感激!

【问题讨论】:

  • 一个问题 - 您不需要在 Python 中初始化列表。或任何变量,就此而言。
  • 目前,voltageArray 是一个 2 项列表,第一项是 25 个 [None]s 的列表,第二项是 630 个 [None]s 的列表。你真的希望它是一个包含 25 个项目的列表,每个项目有 630 个值吗?因为现在,当j&gt;1 时,它会抛出该错误,因为voltageArray 中只有两个值
  • 您正在导入 numpy 但使用列表。相反,请尝试使用 np.zeros((25, 630)) (例如)启动阵列。您可能不需要导入mathscipyarray。摆脱 i = 0j = 0range()s 会处理一切。

标签: python arrays list multidimensional-array nested-loops


【解决方案1】:

您正在导入numpy,所以您不妨使用它 :) 对于这种类型的使用,Numpy 数组更加高效和通用*

问题是您没有以您期望的形状创建voltageArray,您实际上是将它初始化为两个列表的列表,第一个内部列表的长度为 25,第二个内部列表长度为 630。您实际上想要一个形状为 (25, 630) 的二维数组。

timeArray = np.zeros(625)    # Array of 625 zeros
voltageArray = np.zeros((25, 630))  # Array of zeros of shape (25,630)
for i in range(0, 625):  
    timeArray[i] = ws1.cell(row = i+1, column = 4).value  
    for j in range (0, 15):  
        voltageArray[j, i] =(ws1.cell(row = i+1, column = j+5).value)  
        print(j, i)  
        print(voltageArray[j, i])

*Lists 在您不知道它们将有多大或它们将包含什么对象时很好。但是在这里,你知道形状和内容,所以最好使用numpy.array

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多