我很难实现我的功能.

基本上,如果还没有添加新数据,我想连接到包含22列的array.如果没有旧数据,则新数据应成为二维array.

该功能在没有decorator 的情况下运行良好:

@jit(nopython=True)
def add(new,original=np.array([])):
  duplicate=True
  if original.size!=0:
    for raw in original:
      for ii in range(11,19):
        if raw[ii]!=new[ii]:
          duplicate=False
    if duplicate==False:
      res=np.zeros((original.shape[0]+1,22))
      res[:original.shape[0]]=original
      res[-1]=new
      return res
    else:
      return original
  else:
    res=np.zeros((1,22))
    res[0]=new
    return res

如果我删除代码的最后一部分:

  else:
    res=np.zeros((1,22))
    res[0]=new
    return res

它将与njit合作

因此,如果我忽略这个 case ,即还没有旧数据,一切都会好起来.

仅供参考:我传递的数据是浮点和np混合的.楠.

有人有主意吗?

这是我的错误日志(log):

---------------------------------------------------------------------------
TypingError                               Traceback (most recent call last)
<ipython-input-255-d05a5f4ea944> in <module>()
     19     return res
     20 #add(a,np.array([b]))
---> 21 add(a)

2 frames
/usr/local/lib/python3.7/dist-packages/numba/core/dispatcher.py in _compile_for_args(self, *args, **kws)
    413                 e.patch_message(msg)
    414 
--> 415             error_rewrite(e, 'typing')
    416         except errors.UnsupportedError as e:
    417             # Something unsupported is present in the user code, add help info

/usr/local/lib/python3.7/dist-packages/numba/core/dispatcher.py in error_rewrite(e, issue_type)
    356                 raise e
    357             else:
--> 358                 reraise(type(e), e, None)
    359 
    360         argtypes = []

/usr/local/lib/python3.7/dist-packages/numba/core/utils.py in reraise(tp, value, tb)
     78         value = tp()
     79     if value.__traceback__ is not tb:
---> 80         raise value.with_traceback(tb)
     81     raise value
     82 

TypingError: Failed in nopython mode pipeline (step: nopython frontend)
No implementation of function Function(<built-in function getitem>) found for signature:
 
 >>> getitem(float64, int64)
 
There are 22 candidate implementations:
      - Of which 22 did not match due to:
      Overload of function 'getitem': File: <numerous>: Line N/A.
        With argument(s): '(float64, int64)':
       No match.

During: typing of intrinsic-call at <ipython-input-255-d05a5f4ea944> (7)

File "<ipython-input-255-d05a5f4ea944>", line 7:
def add(new,original=np.array([])):
    <source elided>
      for ii in range(11,19):
        if raw[ii]!=new[ii]:
        ^

更新:

新数据的样本输入(1d数组):

array([9.0000000e+00, 0.0000000e+00, 1.0000000e+00, 0.0000000e+00,
       0.0000000e+00,           nan, 5.7300000e-01, 9.2605450e-01,
       9.3171725e-01, 9.2039175e-01, 9.3450000e-01, 1.6491636e+09,
       1.6494228e+09, 1.6496928e+09, 1.6497504e+09, 9.2377000e-01,
       9.3738000e-01, 9.3038000e-01, 9.3450000e-01,           nan,
                 nan,           nan])

原始数据的样本输入(2d数组):

array([[4.00000000e+00, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00,
        0.00000000e+00,            nan, 5.23000000e-01, 8.31589755e-01,
        8.34804877e-01, 8.28374632e-01, 8.36090000e-01, 1.64938320e+09,
        1.64966400e+09, 1.64968920e+09, 1.64975760e+09, 8.30750000e-01,
        8.38020000e-01, 8.34290000e-01, 8.36090000e-01,            nan,
                   nan,            nan]])
  1. 将添加新数据,但没有原始数据
add(new)
Output:

array([[9.0000000e+00, 0.0000000e+00, 1.0000000e+00, 0.0000000e+00,
        0.0000000e+00,           nan, 5.7300000e-01, 9.2605450e-01,
        9.3171725e-01, 9.2039175e-01, 9.3450000e-01, 1.6491636e+09,
        1.6494228e+09, 1.6496928e+09, 1.6497504e+09, 9.2377000e-01,
        9.3738000e-01, 9.3038000e-01, 9.3450000e-01,           nan,
                  nan,           nan]])
  1. 新数据将被添加,之前还没有添加,并且有原始数据
add(new,original)
Output:
array([[4.00000000e+00, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00,
        0.00000000e+00,            nan, 5.23000000e-01, 8.31589755e-01,
        8.34804877e-01, 8.28374632e-01, 8.36090000e-01, 1.64938320e+09,
        1.64966400e+09, 1.64968920e+09, 1.64975760e+09, 8.30750000e-01,
        8.38020000e-01, 8.34290000e-01, 8.36090000e-01,            nan,
                   nan,            nan],
       [9.00000000e+00, 0.00000000e+00, 1.00000000e+00, 0.00000000e+00,
        0.00000000e+00,            nan, 5.73000000e-01, 9.26054500e-01,
        9.31717250e-01, 9.20391750e-01, 9.34500000e-01, 1.64916360e+09,
        1.64942280e+09, 1.64969280e+09, 1.64975040e+09, 9.23770000e-01,
        9.37380000e-01, 9.30380000e-01, 9.34500000e-01,            nan,
                   nan,            nan]])

  1. 将添加以前已经添加的新数据
add(new,original)
Output:

array([[9.0000000e+00, 0.0000000e+00, 1.0000000e+00, 0.0000000e+00,
        0.0000000e+00,           nan, 5.7300000e-01, 9.2605450e-01,
        9.3171725e-01, 9.2039175e-01, 9.3450000e-01, 1.6491636e+09,
        1.6494228e+09, 1.6496928e+09, 1.6497504e+09, 9.2377000e-01,
        9.3738000e-01, 9.3038000e-01, 9.3450000e-01,           nan,
                  nan,           nan]])

推荐答案

主要问题是,Numba假设original1D array,而事实并非如此.纯Python代码之所以能够工作,是因为interpreter永远不会执行循环for raw in original的主体,但Numba需要在执行之前编译所有代码.可以使用以下函数原型解决此问题:

def add(new,original=np.array([[]])):  # Note the `[[]]` instead of `[]`

有鉴于此,Numba可以正确推断original数组是2Darray.

请注意,指定Numpy数组和输入的维度和类型是避免此类错误和潜在错误(例如由于整数/浮点截断)的好方法.

Python相关问答推荐

如何使用stride_tricks.as_strided逆转NumPy数组

有什么方法可以避免使用许多if陈述

将轨迹优化问题描述为NLP.如何用Gekko解决这个问题?当前面临异常:@错误:最大方程长度错误

Pandas 除以一列中出现的每个值

Python plt.text中重叠,包adjust_text不起作用,如何修复?

如何才能知道Python中2列表中的巧合.顺序很重要,但当1个失败时,其余的不应该失败或是0巧合

使用mySQL的SQlalchemy过滤重叠时间段

Select 用a和i标签包裹的复选框?

我从带有langchain的mongoDB中的vector serch获得一个空数组

沿着数组中的轴计算真实条目

' osmnx.shortest_track '返回有效源 node 和目标 node 的'无'

在线条上绘制表面

在Mac上安装ipython

如何在给定的条件下使numpy数组的计算速度最快?

优化器的运行顺序影响PyTorch中的预测

移动条情节旁边的半小提琴情节在海运

让函数调用方程

python panda ExcelWriter切换动态公式到数组公式

如何使用pytest在traceback中找到特定的异常

根据过滤后的牛郎星图表中的数据计算新系列