索引4超出了轴1的边界,轴1的大小为4,代码为双和

2024-05-23 14:48:39 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我有以下函数,它会产生一个越界错误:

import numpy as np
import pylab as plt
import scipy
import math
import sympy as sy


T = sy.Symbol('T')
rho = sy.Symbol('rho')


g_T   = [1,T,T**2,T*sy.log(T),T**2*sy.log(T)]
g_rho  = [1,rho,rho**2,rho*sy.log(rho),rho**2*sy.log(rho)]

g_T_np = np.asarray(g_T)
g_rho_np = np.asarray(g_rho)


c = np.loadtxt("c_test.txt")


def F(T,rho):
    ret = 0
    for n in xrange(1,5):
        for m in xrange(1,6):
            inner= c[n,m]*g_T_np*g_rho_np
        ret += inner
    return ret

print F(T,rho)

.txt文件如下:

-0.529586   -0.000208559    -3.36563E-09    2.29441E-05 
2.22722E-06 -0.00014526 -2.48888E-09    1.89488E-05 
-6.26662E-05    0.000421028 6.17407E-09 -5.14488E-05    
0.09977346  -0.000622051    -8.56485E-09    7.49956E-05 
-0.01437627 -9.86754E-05    -1.59808E-09    1.22574E-05

显示的完整错误为:

Traceback (most recent call last):File "EOS_test.py", line 38, in <module> print F(T,rho) File "EOS_test.py", line 31, in F inner=c[n,m]*g_T_np*g_rho_np IndexError: index 4 is out of bounds for axis 1 with size 4

如何解决此错误?


Tags: intestimporttxtlogforas错误
2条回答

Numpy使用基于0的索引。从它的外观上看,您正在索引从1(第二位置)到4(第五位置)的数组,这当然超出了您正在使用的数组的范围。第二轴也是如此。

其次,你把斧头弄混了:

  • 第一个轴(0)是选定行(0到5)的索引
  • 第二个轴索引列,即行内的值(索引0到4)

这应该有效:

def F(T,rho):
    ret = 0
    for n in range(5):
        for m in range(4):
            inner= c[n,m]*g_T_np*g_rho_np
        ret += inner
    return ret

您的问题在于设置xranges

Python列表(和np数组)是0索引的,因此您不希望索引[1,2,3,4,5]和[1,2,3,4,5,6],而是希望[0,1,2,3,4]和[0,1,2,3,4,5][0,1,2,3]和[0,1,2,3,4]。

这样设置for循环可以解决您的问题:

for n in xrange(0,4):
    for m in xrange(0,5):

或者,您可以利用xrange的默认起点,只需列出一个参数:

for n in xrange(4):
    for m in xrange(5):

另外,对于一个“更加pythonic”的解决方案,不要使用嵌套for循环,而是查看如何在ndarray上迭代。docs给出以下示例:

it = np.nditer(c, flags=['f_index'])
while not it.finished:
    inner= c[it[0]]*g_T_np*g_rho_np
    ret += inner
    it.iternext()

这避免了需要知道要导入的数组大小的整个问题,因此更加健壮。

编辑:正如pdowling在他的回答中提到的,范围号应该是4和5。我把5号和6号留在了我的手机里,现在已经改了。

相关问题 更多 >