TypeError:返回数组必须是ArrayType

时间:2016-10-16 16:02:39

标签: python numpy multidimensional-array typeerror

epsData是一个由DatesStockID组成的二维数组。

我拿出了一些代码,以简化它。

代码调用函数GeneratenewepsepsData由引擎传递。我不确定为什么当我尝试将数组epsss传递给SUE()函数时它会出错。

我尝试使用flatten函数删除数组中的额外括号(如果有),但这没有帮助。

SUE()应该遍历数组并找到第4个最后一个不同的值,然后将它们存储在数组中。

我收到此错误:

TypeError: return arrays must be of ArrayType

以下标有三行:

def lastdifferentvalue(vals,datas,i):
  sizes=len(datas)
  j=sizes-1
  values=0
  while (i>0) and (j>=0):
    if logical_and((vals-datas[j]!=0),(datas[j]!=0),(datas[j-1]!=0)): # !! HERE !!
      i=i-1
      values=datas[j-1]
    j=j-1
  return j, values

def SUE(datas):
  sizes=len(datas)
  j=sizes-1
  values=0
  sues=zeros(8)
  eps1=datas[j]
  i=7
  while (j>0) and (i>=0) :
    counts, eps2=lastdifferentvalue(eps1,array(datas[0:j]),4)
    if eps2!=0:
      sues[i]=eps1-eps2
      i=i-1
      j,eps1=lastdifferentvalue(eps1,datas[0:j],1) # !! HERE !!

  stddev=std(SUE)
  sue7=SUE[7]
  return stddev,sue7          

def Generate(di,alpha):      

    #the code below loops through the data. neweps is a two dimensional array of floats [dates, stockid]                     
    for ii in range(0,len(alpha)):
      if (epss[2,ii]-epss[1,ii]!=0) and (epss[2,ii]!=0) and (epss[1,ii]!=0):
        predata=0
        epsss= neweps[di-delay-250:di-delay+1,ii]
        stddevs,suedata= SUE(array(epsss.flatten())) # !! HERE !!

2 个答案:

答案 0 :(得分:0)

据推测,您正在以

的形式使用numpy.logical_and
np.logical_and(a, b, c)

意思是你想要采取逻辑和三个。但是,如果您查看文档,那不是它的作用。它将c解释为您打算存储结果的数组。

你可能在这里的意思是

np.logical_and(a, np.logical_and(b, c))

答案 1 :(得分:0)

该行:

if logical_and((vals-datas[j]!=0),(datas[j]!=0),(datas[j-1]!=0))

有两个错误:

  1. 据推测,您希望执行logical_and而不是(vals-datas[j] != 0) (datas[j] != 0) (datas[j-1] != 0) 。但是numpy.logical_and只接受两个输入参数,第三个如果传递则假定为输出数组。因此,如果您希望numpy.logical_and对三个数组进行操作,则应表示为:

    logical_and(logical_and((vals-datas[j] != 0), (datas[j] != 0)), (datas[j-1] != 0))
    
  2. 在任何情况下,在logical_and语句中使用if都没有意义。它返回一个数组,并且数组没有真值。也就是说,logical_and的结果是一个布尔数组,其中一些是真的而一些是假的。您是否希望检查它们是否全部是真的吗?或者,如果至少某些是真的吗?

    如果是前者,则应将其测试为:

    if numpy.all(logical_and(...)):
       ...
    

    如果后者然后将其测试为:

    if numpy.any(logical_and(...)):
       ...