无法在 numba 中使用 hstack 堆叠 numpy 数组

cannot stack numpy arrays with hstack in numba

我有一个 mat 类型的矩阵

array([[0.00000000e+00, 1.98300000e+03, 1.57400000e+00, ...,
                   nan,            nan, 2.38395652e+00],
       [0.00000000e+00, 1.98400000e+03, 1.80600000e+00, ...,
                   nan, 1.38395652e+00, 2.29417391e+00],
       [0.00000000e+00, 1.98500000e+03, 4.72400000e+00, ...,
        1.38395652e+00, 1.29417391e+00, 5.68147826e+00],
       ...,
       [9.87500000e+03, 1.99200000e+03, 1.59700000e+00, ...,
                   nan,            nan, 4.61641176e+00],
       [9.87500000e+03, 1.99300000e+03, 3.13400000e+00, ...,
                   nan, 3.61641176e+00, 5.45824421e+00],
       [9.87500000e+03, 1.99400000e+03, 7.61900000e+00, ...,
        3.61641176e+00, 4.45824421e+00, 1.05298571e+01]])

维度 (107196, 46) 和一个 vec 类型的向量

array([0.23, 0., 0.28, ..., 0.99, 1.0, 0.05])

尺寸为 (107196,)。 我想使用 np.hstack 函数将 vec 垂直堆叠为 mat 的最后一列。为此,我使用 np.hstack((mat,vec[:,None])) 现在,我想获得一个包含此操作的 njitted 函数。说

@jit(nopython=True)
def simul_nb(matrix, vector):
    return np.hstack((matrix,vector[:,None]))

但是,当我 运行 simul_nb(mat,vec) 我得到以下错误:

Traceback (most recent call last):

  File "<ipython-input-340-6c5341efa9b6>", line 1, in <module>
    simul_nb(income_df,nols)

  File "C:\Users\bagna\anaconda3\lib\site-packages\numba\core\dispatcher.py", line 415, in _compile_for_args
    error_rewrite(e, 'typing')

  File "C:\Users\bagna\anaconda3\lib\site-packages\numba\core\dispatcher.py", line 358, in error_rewrite
    reraise(type(e), e, None)

  File "C:\Users\bagna\anaconda3\lib\site-packages\numba\core\utils.py", line 80, in reraise
    raise value.with_traceback(tb)

TypingError: No implementation of function Function(<built-in function getitem>) found for signature:
 
getitem(readonly array(float64, 1d, C), Tuple(slice<a:b>, none))
 
There are 16 candidate implementations:
      - Of which 14 did not match due to:
      Overload of function 'getitem': File: <numerous>: Line N/A.
        With argument(s): '(readonly array(float64, 1d, C), Tuple(slice<a:b>, none))':
       No match.
      - Of which 2 did not match due to:
      Overload in function 'GetItemBuffer.generic': File: numba\core\typing\arraydecl.py: Line 162.
        With argument(s): '(readonly array(float64, 1d, C), Tuple(slice<a:b>, none))':
       Rejected as the implementation raised a specific error:
         TypeError: unsupported array index type none in Tuple(slice<a:b>, none)
  raised from C:\Users\bagna\anaconda3\lib\site-packages\numba\core\typing\arraydecl.py:68

During: typing of intrinsic-call at <ipython-input-339-4d5037c266b7> (3)
During: typing of static-get-item at <ipython-input-339-4d5037c266b7> (3)

如何使该功能发挥作用?

Numba 不理解 [:,None] 重塑索引。事实上,后者等同于 [:,np.newaxis],您可能已经知道,目前 np.newaxis 不是 supported numpy features,这部分解释了错误消息。在这里,您应该只使用 vector.reshape((-1,1))np.expand_dims(vector,1)) 来代替,这应该给出:

@jit(nopython=True)
def simul_nb(matrix, vector):
    return np.hstack((matrix,vector.reshape((-1,1))))

>>> new_mat = simul_nb(matrix, vector)
>>> new_mat.shape
>>> (107196, 47)