Reputation: 1518
The code is here:
import numba as nb
import numpy as np
@nb.njit
def func(size):
ary = np.array([np.arange(size),np.arange(size)+1,np.arange(size)-1]).T
X = np.array([ary[1:,0] - ary[:-1,2],
ary[1:,1] - ary[:-1,2],
ary[1:,0] - ary[1:,1]
])
return X
Z = func(10**9)
When I run the code, it gives me an error message and I don't really understand what's going on here. Do functions decorated by njit not support creating new arrays inside the functions? Error message is the following:
TypingError: Invalid use of Function(<built-in function array>) with argument(s) of type(s): (list(array(int64, 1d, C)))
* parameterized
In definition 0:
TypingError: array(int64, 1d, C) not allowed in a homogeneous sequence
raised from C:\Users\User\Anaconda3\lib\site-packages\numba\typing\npydecl.py:459
In definition 1:
TypingError: array(int64, 1d, C) not allowed in a homogeneous sequence
raised from C:\Users\User\Anaconda3\lib\site-packages\numba\typing\npydecl.py:459
This error is usually caused by passing an argument of a type that is unsupported by the named function.
[1] During: resolving callee type: Function(<built-in function array>)
[2] During: typing of call at C:/Users/User/Desktop/all python file/3.2.4/nb_datatype.py (65)
EDIT: I forgot to transpose the array before edit, it should be a 10^9 by 3 array.
Upvotes: 6
Views: 5202
Reputation: 1121
I followed @jpp's advice and switched to np.float64
rather than float
, but I also had to switch np.empty([1,2,3], np.float64)
to np.empty((1,2,3), np.float64)
.
Upvotes: 0
Reputation: 164683
Instantiating NumPy arrays via a list of NumPy arrays, or even a list of lists, is not supported by numba.njit
. Instead, use np.empty
and then assign values via NumPy indexing:
@nb.njit
def func(size):
row_count = 3
ary = np.empty((row_count, size))
ranger = np.arange(size)
ary[0] = ranger
ary[1] = ranger + 1
ary[2] = ranger - 1
X = np.empty((row_count, row_count - 1))
X[0] = ary[1:,0] - ary[:-1,2]
X[1] = ary[1:,1] - ary[:-1,2]
X[2] = ary[1:,0] - ary[1:,1]
return X
Z = func(10**2)
print(Z)
array([[-1., -4.],
[ 0., -3.],
[-1., -1.]])
Upvotes: 5