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

Python 索引4超出轴1的界限,大小为4,代码为双和,python,bounds,out,Python,Bounds,Out,嗨,我有以下函数,它会产生越界错误: 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

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

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(最近一次调用last):文件“EOS_test.py”,第38行,在打印F(T,rho)文件“EOS_test.py”,第31行,在F inner=c[n,m]*g_T_np*g_rho_np索引器:索引4超出大小为4的轴1的界限


如何解决此错误?

您的问题在于设置
xrange
s

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,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循环,而是查看如何在数据数组上迭代。下面是一个例子:

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()
这避免了需要知道要导入的阵列大小的整个问题,因此更加健壮


编辑:正如普多林在他的回答中提到的,范围数字应该是4和5。我在aswer中留下了5和6,现在已经改变了。Numpy使用基于0的索引。从外观上看,您正在将数组从1(第2位)索引到4(第5位),这当然超出了您正在使用的数组的范围。第二个轴也是如此

其次,你把你的斧子弄混了:

  • 第一个轴(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

嗨,肖恩,欢迎来到Stack Overflow。我修正了你的格式。为了便于将来参考,代码(以及您希望看起来像代码的东西)的格式只需缩进(至少)4个空格即可。您也可以选择代码,然后单击编辑器中类似于
{}
的按钮。您可以发布准确的错误,并指出它发生在哪一行吗?@ScottMermelstein:非常感谢您的格式设置看起来好多了!谢谢你告诉我以后怎么做。错误看起来像这样\Traceback(最近一次调用last):文件“EOS_test.py”,第38行,在打印F(T,rho)文件“EOS_test.py”,第31行,在F inner=c[n,m]*g_T_np*g_rho_np索引器中:索引4超出了大小为的轴1的界限4@ScottMermelstein当前位置看起来仍然很糟糕。。。这在评论中也起作用吗?:)sryComments的格式化功能有限。(单击评论框旁的“帮助”查看内容。)您的最佳选择,尤其是与问题相关的信息,是使用额外信息编辑问题。请这样做,即使我已经回答了。:-)<代码>对于xrange(0,4)中的n:对于xrange(0,5)中的m:以前尝试过,但没有成功。其他选择也没有。我认为@pdowling是正确的,因为当我切换轴时,它工作了。但是谢谢你的快速回复如果你觉得他的信息有帮助,你应该投票表决。(你可以向上或向下投票任何答案。)如果它解决了你的问题,你应该点击复选标记。看到慢慢地得到它的悬挂物了吧!:)非常感谢你的耐心。