Python,将n个m个numpy数组与n个大小的numpy数组进行比较

时间:2018-12-09 12:15:35

标签: python arrays list numpy compare

我正在做一个编程项目,由于某种原因,我很难坚持。

gradeList = [-3,0,2,4,7,10,12]

    for i1 in range(np.size(grades,1)-1):
        for i2 in range(np.size(grades,0)-1):
            for i3 in range(len(gradeList)-1):
                if grades[i1,i2] != gradeList[i3]:
                    print(grades[i1,i2])
                    print(i1,i2,i3)
                    print("This is an error"+str(grades[i1,i2]))
                else:
                    print("FINE")

我试图检查我的gradeList中每个值的n x m数组中的每个值,最终我想打印n * m数组中不在gradeList中的成绩的位置。我收到以下错误代码:

IndexError: index 3 is out of bounds for axis 1 with size 3

我的成绩数组:

 grades = np.array([[  7.    7.    4. ],[ 12.   10.   10. ],[ -3.    7.    2. ],[ 10.   12.   12. ],[ 12.   12.   12. ],[ 10.   12.   12. ],[ -3.8   2.2  11. ],[ 20.   12.6 100. ],[  4.   -3.    7. ],[ 10.   10.   10. ],[  4.   -3.    7. ],[ 10.   10.   10. ],[ 10.   10.   10. ],[ 12.   12.   12. ],[ -3.   -3.   -3. ],[ 20.   12.6 100. ]])

2 个答案:

答案 0 :(得分:0)

您已经交换了i1i2的定义,这将导致出现错误。修正程式码的方法如下:

for i1 in range(grades.shape[0]):
    for i2 in range(grades.shape[1]):
        for i3 in range(len(gradeList)):
            if grades[i1,i2] != gradeList[i3]:
                print(grades[i1,i2])
                print(i1,i2,i3)
                print("This is an error"+str(grades[i1,i2]))
            else:
                print("FINE")

在上面的代码中,grades.shape[0]与原始代码中的np.size(grades, 0)等效。 grades.shape[0]是最常用的习惯用法。

此外,我从范围的定义中删除了所有-1调整项。如果那里有那些,它将防止循环到达数组中的最后一个值。 range的行为是它将在达到您设置的最大值之前停止一个值。

例如,list(range(len(gradeList)))将返回gradeList的完整索引集:

[0, 1, 2, 3, 4, 5, 6]

list(range(len(gradeList - 1)))将省略最后一个索引:

[0, 1, 2, 3, 4, 5]

答案 1 :(得分:0)

我认为问题出在那儿

# i1 => [0,1]
# i2 => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
# i3 => [0, 1, 2, 3, 4, 5]

调用grades[i1,i2]时可以拥有grades[0,3]及其边界,因为该轴具有三个元素。

我猜解决方案是将grades[i1,i2]更改为grades[i2,i1]出现的位置(三次)。