Python, сравните n n m массив с n размером n - PullRequest
0 голосов
/ 09 декабря 2018

Я занимаюсь программированием, и по какой-то причине я застрял.

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")

Я пытаюсь проверить каждое значение в массиве n by m для каждого значения в моем gradeList, и в конце концов яхотите напечатать позицию оценок в массиве n by 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 голосов
/ 09 декабря 2018

Я думаю, что проблема заключается в этом:

# 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] там, где оно появляется (три раза).

0 голосов
/ 09 декабря 2018

Вы поменяли определения i1 и i2, что приводит к получаемой вами ошибке.Вот как исправить ваш код:

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]
...