【问题标题】:Error with index. index 0 is out of bounds for axis 0 with size 0索引错误。对于大小为 0 的轴 0,索引 0 超出范围
【发布时间】:2018-02-12 05:17:50
【问题描述】:

当我运行我的代码时,我得到了错误

IndexError:对于 v[0]=v0,第 42 行上大小为 0 的轴 0 的索引 0 超出范围。

我不熟悉python,不知道如何调试。

""" Density at height y """
def rho(rh, y):
rho = rh*math.exp(-y/7249)
return rho

""" Acceleration of skydiver """
def accl(m, g, rho, v, As, Cs, Ap, Cp):
if y[i+1] >= 1200:
    accl = (1/(2*m) * rho(rh, y) * v**2 * As * Cs - g )
else:
    accl = (1/(2*m) * rho(rh, y) * v**2 * (As * Cs + Ap * Cp) - g)
return accl

h0 = 4000 # initial hieght
dt = 0.1 #timestep
n  = int(180/dt)
#lists for displacement, time, and velocities
v= np.array([])
v[0] = v0
t= np.array([])
t[0] = t0
y= np.array([])
y[0] = h0

#calculation of time, velocity and displacement
for i in range(n):
t[i+1] = t[i] + dt
v[i+1] = v[i] + accl(m, g, rho, v[i], As, Cs, Ap, Cp) * dt
y[i+1] = y[i] + v[i+1] * dt
if y[i+1] < 0:
    #ends plot once skydiver has landed
        break
# Plot
plt.plot(t, y, label = 'Position m')
plt.plot(t, v, label = 'Speed m/s')
plt.plot(t, accl, label = 'Acceleration m/s^2', color = 'green')
plt.xlim([t[0], t[-1]])
plt.xlabel("Time (seconds)")
plt.legend()

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    从空列表创建的 Numpy 数组不能被索引 - 它们没有任何要索引的元素。

    np.array([]).shape
    # (0,)
    

    如果事先知道v的尺寸,可以使用np.empty():

    n = 10
    np.empty(n, dtype=float)
    # array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])
    

    或者,只需将v 初始化为v0:

    v = np.array([v0])
    

    【讨论】:

      【解决方案2】:
      v= np.array([])
      v[0] = v0
      

      这没有任何意义:您试图为空数组(没有元素!)的第一个元素设置一个值。

      试试这个:v = np.array([v0])

      如果您想扩大您的阵列,请执行以下操作:

      v = []
      # whatever logic to grow v like:
      for i in range(10):
          v.append(2*i-1)
      # now turn it into an np.array:
      v = np.array(v)
      

      【讨论】:

      • 这将在他访问 v 的更多索引时产生错误。他需要用大小 n 初始化 v。
      • @wit221 否:list 不需要预定义大小。
      • 是的,我指的是您使用 v = np.array([v0]) 的解决方案。这会在访问 v[i+1] = v[i] + ... 中的 numpy 数组时产生错误
      【解决方案3】:

      将v = np.array([]) 替换为v = np.zeros(n+1)。您无法访问超出其界限的 numpy 数组的元素。您的声明会创建一个空的 numpy 数组。

      【讨论】:

        猜你喜欢
        • 2015-05-26
        • 1970-01-01
        • 2021-11-03
        • 2020-04-24
        • 1970-01-01
        • 2021-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多