【问题标题】:TypeError: return arrays must be of ArrayTypeTypeError:返回数组必须是 ArrayType
【发布时间】:2017-02-25 14:33:19
【问题描述】:

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

为了简单起见,我取出了一些代码。

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

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

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

我收到此错误:

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 !!

【问题讨论】:

  • 我可以在该错误的开头和结尾处有“**”的三行。非常感谢
  • 请阅读“minimal reproducible example”。我们需要演示问题的minimum 程序,以及支持输入和所需输出。将代码减少到最小但仍然重复问题的过程通常表明问题是什么。
  • 加粗在代码块中不起作用 - 我将其更新为注释,以便可以运行代码。根据需要进行调整。
  • 我已经编辑了代码并试图总结它。一些数据从引擎传递到这里。请你能帮我看看可能是什么问题吗?非常感谢
  • 大家好,任何人都可以看看我的问题。非常感谢!

标签: python numpy multidimensional-array typeerror


【解决方案1】:

大概,你正在使用numpy.logical_and,形式为

np.logical_and(a, b, c)

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

你的意思可能是这样的

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

【讨论】:

    【解决方案2】:

    行:

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

    有两个错误:

    1. 大概你想在(vals-datas[j] != 0) (datas[j] != 0) (datas[j-1] != 0) 上执行logical_and。然而numpy.logical_and 只接受两个 input 参数,如果通过第三个参数,则假定为 output 数组。因此,如果您希望 numpy.logical_and 对三个数组进行操作,则应表示为:

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

      如果是前者,那么你应该测试它:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-15
      • 2021-07-21
      • 1970-01-01
      • 2014-09-14
      • 2018-10-30
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多