numba: No implementation of function Function(<built-in function getitem>) found for signature:

Question:

I´m having a hard time implementing numba to my function.

Basically, I`d like to concatenate to arrays with 22 columns, if the new data hasn’t been added yet. If there is no old data, the new data should become a 2d array.

The function works fine without the 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

Also if I remove the last part of the code:

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

It would work with njit

So if I ignore the case, that there hasn´t been old data yet, everything would be fine.

FYI: the data I`m passing in is mixed float and np.nan.

Anybody an idea?
Thank you so much in advance!

this is my error 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]:
        ^

Update:
Here is how it should work. The function shall cover three main cases

sample input for new data (1d array):

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])

sample input for original data (2d array):

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. new data will be added and there is no original data
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. new data will be added, which hasn´t already been added before and there is original data
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. new data will be added, which already had been added before
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]])
Asked By: AndreasKöszegi

||

Answers:

The main issue is that Numba assumes that original is a 1D array while this is not the case. The pure-Python code works because the interpreter it never execute the body of the loop for raw in original but Numba need to compile all the code before its execution. You can solve this problem using the following function prototype:

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

With that, Numba can deduce correctly that the original array is a 2D one.

Note that specifying the dimension and types of Numpy arrays and inputs is a good method to avoid such errors and sneaky bugs (eg. due to integer/float truncation).

Answered By: Jérôme Richard

I am having the same problem. the code runs and gives the desired output with some warnings with the following:

pair_array = np.array(pair_array)
def pair_freq_calc (pair_array, pair_freq = np.zeros([len(pair_array),1])):
    
    for i in range(len(pair_array) ):
        n = 0
        for j in range(len(pair_array) ):

            if (pair_array[i] == pair_array[j] ).all():
                n += 1
        pair_freq[i] = n
        print(pair_freq)
    return(pair_freq)
jit_pair_freq = jit()(pair_freq_calc)
pair_freq = jit_pair_freq( pair_array )

But if I write:

pair_array = np.array(pair_array)
def pair_freq_calc (pair_array,  pair_freq = np.zeros([len(pair_array),1])):

for i in range(len(pair_array) ):
    n = 0
    for j in range(len(pair_array) ):

        if (pair_array[i] == pair_array[j] ).all():
            n += 1
    pair_freq[i] = n
    print(pair_freq)
return(pair_freq)

jit_pair_freq = jit()(pair_freq_calc)
pair_freq = jit_pair_freq( pair_array )

this does not show any warning but output shows:

pair_freq = array([[0.],
   [0.],
   [0.],
   ...,
   [0.],
   [0.],
   [0.]])

That means values of pair_freq gets no update.

pair_array is an nx2 matrix.

Answered By: souvik datta
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.