Python numba njit给出了2D np.数组索引上的my和error
我试图在njit函数中用一个包含我想要的索引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,
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]