【问题标题】:IndexError: list assignment index out of range in python 2.7.11IndexError:python 2.7.11 中的列表分配索引超出范围
【发布时间】:2016-07-29 22:51:57
【问题描述】:

我只是用python解决一个问题,我的代码是:

from math import sin,pi
import numpy
import numpy as np
import pylab
N=20
x = np.linspace(0,1, N)
def v(x):
    return 100*sin(pi*x)

#set up initial condition
u0 = [0.0]              # Boundary conditions at t= 0
for i in range(1,N):
    u0[i] = v(x[i])

我想通过在range(0, N) 之后更新 v(x) 来绘制结果。它看起来很简单,但也许你们可以提供帮助,因为它给了我一个错误,比如

Traceback (most recent call last):
  File "/home/universe/Desktop/Python/sample.py", line 13, in <module>
    u0[i] = v(x[i])
IndexError: list assignment index out of range

【问题讨论】:

    标签: arrays python-2.7 python-3.x numpy matplotlib


    【解决方案1】:

    您可以将u0[i] = v(x[i]) 更改为u0.append(v(x[i]))。但是你应该写得更优雅

    u0 = [v(xi) for xi in x]
    

    索引i 是错误磁铁。

    【讨论】:

    • 感谢各位大佬,这里的所有代码都可以正常工作
    【解决方案2】:

    由于您使用的是 numpy,我建议您使用 np.vectorize。这样,您可以将数组x 直接传递给函数,该函数将返回一个大小相同的数组,该函数应用于输入数组的每个元素。

    from math import sin,pi
    import numpy
    import numpy as np
    import pylab
    N=20
    x = np.linspace(0,1, N)
    def v(x):
        return 100*sin(pi*x)
    
    vectorized_v = np.vectorize(v) #so that the function takes an array of x's and returns an array again
    u0 = vectorized_v(x) 
    

    输出:

    array([  0.00000000e+00,   1.64594590e+01,   3.24699469e+01,
             4.75947393e+01,   6.14212713e+01,   7.35723911e+01,
             8.37166478e+01,   9.15773327e+01,   9.69400266e+01,
             9.96584493e+01,   9.96584493e+01,   9.69400266e+01,
             9.15773327e+01,   8.37166478e+01,   7.35723911e+01,
             6.14212713e+01,   4.75947393e+01,   3.24699469e+01,
             1.64594590e+01,   1.22464680e-14])
    

    【讨论】:

      【解决方案3】:

      u 是一个包含一个元素的列表,因此您不能将值分配给不存在的索引。而是让u 成为字典

      u = {}
      u[0] = 0.0
      for i in range(1,N):
          u[i] = v(x[i])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-13
        • 1970-01-01
        • 2016-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-27
        相关资源
        最近更新 更多