【问题标题】:Nested FOR loop indexing issue - Python嵌套 FOR 循环索引问题 - Python
【发布时间】:2015-02-14 04:29:28
【问题描述】:

我在嵌套 for 循环中遇到了索引问题。 Python 吐出一个索引错误,告诉我我的索引超出范围。

以下是我的代码和后续错误:

from math import *
import numpy as np
from scipy import integrate
import matplotlib.pyplot as plt
import os

croot = 1
ctip = 1
span = 1
thetaroot = 0
thetatip = 0
a0root = 0.11
a0tip = 0.11
alpha = 0
alpha0root = -2.5
alpha0tip = -2.5
thetaroot = thetaroot * arctan(1.) / 45.
thetatip = thetatip * arctan(1.) / 45.
alpha = alpha * arctan(1.) / 45.
alpha0root = alpha0root * arctan(1.) / 45.
alpha0tip = alpha0tip * arctan(1.) / 45.
n = 10
theta = np.empty(n, dtype = object)
y = np.empty(n, dtype = object)
c = np.empty(n, dtype = object)
cl = np.empty(n, dtype = object)
alp = np.empty(n, dtype = object)
a = np.empty(n, dtype = object)
rhs = np.empty(n, dtype = object)
b = np.empty(n, dtype = object)
a = np.empty(n, dtype = object)
rhs = rhs[:,None]
b = b[:,None]
a = a[:,None]
#
# Define properties at n span stations
#
pi = 4. * arctan(1.)
for i in range(0,n):
    theta[i] = i * pi / (2. * n)
    y[i] = span * 0.5 * cos(theta[i])
    c[i] = croot + (ctip - croot) * y[i] * 2. / span
    alp[i] = alpha + thetaroot - (alpha0root + (alpha0tip - alpha0root + thetaroot - thetatip) * y[i] * 2. / span)
    a[i] = a0root + (a0tip - a0root) * y[i] * 2. / span

pi = 4. * arctan(1.)
# Set up 2n x 2n system of equations for A1, A3 , ... A2n-1
for j in range(0,n):
    mu = c[j] * a[j] / (4. * span); print('mu=',mu)
    rhs[j,0] = alp[j] * sin(theta[j]) * c[j] * a[j] / (4 * span)
    for i in range(0,n):
        l = 2 * i - 1
        b[j,i] = sin(l * theta[j]) * (mu * l + sin(theta[j]))

然后我收到错误:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-70-b5bd95e69bb5> in <module>()
     45     for i in range(0,n):
     46         l = 2 * i - 1
---> 47         b[j,i] = sin(l * theta[j]) * (mu * l + sin(theta[j]))
     48 
     49 

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

如何有效地调出两个索引?在 MATLAB 中,b(j,i) 是正常语法。

感谢任何帮助,谢谢!

【问题讨论】:

  • 这是 numpy - 在这种情况下,您在哪里导入相关库
  • 抱歉,我已经用导入的库更新了我的脚本。正在使用 Numpy。
  • b(n,1)。如果在 MATLAB 中与此接近,那是因为如果索引超出当前大小,该语言会扩展数组。在numpy 中,您必须将其初始化为正确的最终形状。

标签: python for-loop numpy indexing


【解决方案1】:

b = np.empty(n, dtype = object)n=10 的调用创建了一个一维数组,但您正在索引它 (b[j,i]),就好像它是一个二维数组一样。

要初始化一个 10 x 10 数组,您可以调用 b = np.empty([n, n], dtype = object)

编辑: 我没有注意到这个作业:b = b[:,None] 这创造了这个:

>>> [[None]
 [None]
 [None]
 [None]
 [None]
 [None]
 [None]
 [None]
 [None]
 [None]]

这是一个二维数组,但试图索引超过内部数组的第一个元素(仅包含 None)会导致您的错误。

【讨论】:

  • 我假设你的意思是 b = np.empty([n, n], dtype = object) ??
  • 糟糕,是的,我确实是这个意思。
  • 那么,既然它试图索引超过第一个元素,你会建议作为嵌套循环的可行替代方案吗?
  • 我的建议是将 b 创建为 b = np.empty([n, n], dtype = object),然后嵌套循环应该可以工作。 (并删除b = b[:,None]
  • 在执行此操作时,我收到一条错误消息,指出“indeces 太多”。它指向包含 rhs[j,i] = alp[j] * sin(theta[j]) * c[j] * a[j] / (4 * span) 的行
猜你喜欢
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多