Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numba njit给出了2D np.数组索引上的my和error_Python_Numba - Fatal编程技术网

Python numba njit给出了2D np.数组索引上的my和error

Python numba njit给出了2D np.数组索引上的my和error,python,numba,Python,Numba,我试图在njit函数中用一个包含我想要的索引a,一个矩阵切片D的向量索引一个二维矩阵B 这里有一个简单的例子: import numba as nb import numpy as np @nb.njit() def test(N,P,B,D): for i in range(N): a = D[i,:] b = B[i,a] P[:,i] =b P = np.zeros((5,5)) B = np.random.random((5,

我试图在njit函数中用一个包含我想要的索引
a
,一个矩阵切片
D
的向量索引一个二维矩阵
B
这里有一个简单的例子:

import numba as nb
import numpy as np

@nb.njit()
def test(N,P,B,D):
    for i in range(N):
        a = D[i,:]
        b =  B[i,a]
        P[:,i] =b

P = np.zeros((5,5))
B = np.random.random((5,5))*100
D = (np.random.random((5,5))*5).astype(np.int32)
print(D)
N = 5
print(P)
test(N,P,B,D)
print(P)
我在
b=b[I,a]

File "dj.py", line 10:
def test(N,P,B,D):
    <source elided>
        a = D[i,:]
        b =  B[i,a]
        ^

This is not usually a problem with Numba itself but instead often caused by
the use of unsupported features or an issue in resolving types.
文件“dj.py”,第10行:
def测试(N、P、B、D):
a=D[i,:]
b=b[i,a]
^
这通常不是麻木本身的问题,而是由
使用不支持的功能或解析类型时出现问题。
我不明白我做错了什么。
代码在没有
@nb.njit()
decorator的情况下工作numba不支持numpy所支持的所有“花式索引”——在这种情况下,问题是使用
a
数组选择数组元素

对于您的特殊情况,因为您事先知道
b
的形状,所以可以这样解决:

import numba as nb
import numpy as np

@nb.njit
def test(N,P,B,D):
    b = np.empty(D.shape[1], dtype=B.dtype)

    for i in range(N):
        a = D[i,:]
        for j in range(a.shape[0]):
            b[j] = B[i, j]
        P[:, i] = b

numba不支持与numpy完全相同的“花式索引”——在本例中,问题是使用
a
数组选择数组元素

对于您的特殊情况,因为您事先知道
b
的形状,所以可以这样解决:

import numba as nb
import numpy as np

@nb.njit
def test(N,P,B,D):
    b = np.empty(D.shape[1], dtype=B.dtype)

    for i in range(N):
        a = D[i,:]
        for j in range(a.shape[0]):
            b[j] = B[i, j]
        P[:, i] = b

另一种解决方案是在调用test之前在B上应用swapax,并反转索引(
B[i,a]
->
B[a,i]
)。我不知道这是为什么,但以下是实现:

import numba as nb
import numpy as np

@nb.njit()
def test(N,P,B,D):
    for i in range(N):
        a = D[i,:]
        b =  B[a,i]
        P[:, i] = b
    
P = np.zeros((5,5))
B = np.arange(25).reshape((5,5))
D = (np.random.random((5,5))*5).astype(np.int32)
N = 5
test(N,P,np.swapaxes(B, 0, 1), D)

顺便说一下,在@chrisb给出的答案中,它不是:
b[j]=b[i,j]
,而是
b[j]=b[i,a[j]

另一个解决方案是在调用test之前对b应用交换键,并反转索引(
b[i,a]
->
b[a,i]
)。我不知道这是为什么,但以下是实现:

import numba as nb
import numpy as np

@nb.njit()
def test(N,P,B,D):
    for i in range(N):
        a = D[i,:]
        b =  B[a,i]
        P[:, i] = b
    
P = np.zeros((5,5))
B = np.arange(25).reshape((5,5))
D = (np.random.random((5,5))*5).astype(np.int32)
N = 5
test(N,P,np.swapaxes(B, 0, 1), D)
顺便说一句,@chrisb给出的答案不是:
b[j]=b[i,j]
,而是
b[j]=b[i,a[j]