Как я могу исправить "IndexError: только целые числа" в массиве numpy? - PullRequest
0 голосов
/ 13 сентября 2018

(Решено. См. Ответ ниже) Я учу себя Python при подготовке к школьному проекту. Я столкнулся со следующей ошибкой, которую не могу понять, как исправить:

IndexError: допустимыми являются только целые числа, срезы (:), многоточие (...), numpy.newaxis (None) и целые или логические массивы

Вот код, который я пытаюсь запустить (отредактировал его, основываясь на комментариях)

from sympy import *
from sympy.abc import i
from mpmath import *
import numpy as np
np.set_printoptions(suppress=True)

N = 3
M = np.zeros(shape=(N, N))
for n in range(0, N):
    M[0, n] = fac(n)    # mpmath.fac
for m in range(1, N):
    for n in range(0, N):
        M[m, n] = (Sum(M[m - 1, i], (i, 0, n + 1))) / (n+1) 
print(M)

По сути, я хочу указать размерность для массива и первую строку для массива. Затем я хочу построить оставшиеся записи в массиве определенным образом (суммирование по Холдеру, если вы знаете об этой технике суммирования).

Я просмотрел различные другие вопросы переполнения стека с этой конкретной ошибкой, но эти вопросы были за пределами моего текущего знания или не совсем решали мою проблему. Я возился со многими параметрами и выделил проблему в строке 13. В частности, как только я помещаю «i» в M [m-1, i], я получаю сообщение об ошибке. Мой код запускается, если вместо «i» я ставлю любое число меньше размера, но это не та конструкция, которая мне нужна.

Например, запись M[2,1] должна быть построена как:

M[2,1] = (M[1,0] + M[1,1]) / 2

То, что я думал, соответствовало сумме, которую я написал. Как мои индексы стали чем-то отличным от положительного целого числа?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Я смог исправить ошибку, основываясь на помощи каждого. Спасибо! Я вижу, что я не должен импортировать все по звездам, и что я должен придерживаться либо симпати, либо комков, чтобы они не боролись друг с другом. Мне удалось переписать мою программу, чтобы правильно построить суммы Holder. Вот мой бегущий код:

import sympy as sy
import mpmath as mp
import numpy as np
np.set_printoptions(suppress=True)
sy.init_printing(use_unicode=False, wrap_line=False, no_global=True)
N = 5
M = np.zeros((N, N))
for n in range(0, N):                       
    M[0, n] = mp.fac(n)
for n in range(0, N):                      
    for i in range(0, n + 1):
        M[1, n] += (M[0, i])
for m in range(2, N):                       
    for n in range(0, N):
        for i in range(0, n + 1):
            M[m, n] += (M[m - 1, i])
        M[m, n] = M[m, n] / (n + 1)
print(M)                                    

Это правильно (и красиво) печатает:

[[ 1.          1.          2.          6.         24.        ]
 [ 1.          2.          4.         10.         34.        ]
 [ 1.          1.5         2.33333333  4.25       10.2       ]
 [ 1.          1.25        1.61111111  2.27083333  3.85666667]
 [ 1.          1.125       1.28703704  1.53298611  1.99772222]]

Еще раз спасибо за помощь!

0 голосов
/ 13 сентября 2018

Вы смешиваете numpy и sympy, и это создает проблемы:

Ваш sympy импорт определяет i как символ (это не очевидно для numpy пользователей):

In [1]: from sympy.abc import *
In [2]: i
Out[2]: i

затем вы определяете массив numpy.(import numpy as np лучше, чем *):

In [3]: M=np.zeros((3,3))

при попытке использовать это i, так как индекс повышает вашу ошибку:

In [4]: M[1,i]
------------------------------------------------------------------
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

Символ может работать в sympy матрица, но она не работает при индексации массива numpy.

Ms = sy.zeros(3,3)      # sympy matrix  
for m in range(1,3):
    for n in range(3):
        Ms[m,n] = (sy.Sum(Ms[m-1,i],(i,0,n+1)))/(n+1)

Это работает, хотя результирующий Ms не имеет особого смысла.

Итак, кореньпроблема в том, что вы смешиваете пустышку и симпатию, возможно, из-за невежества и, возможно, из-за импорта *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...