Python 数组中的 Numba 值
Python Numba Value in Array
我正在尝试检查一个数字是否在 int8
的 NumPy 数组中。我试过这个,但它不起作用。
from numba import njit
import numpy as np
@njit
def c(b):
return 9 in b
a = np.array((9, 10, 11), 'int8')
print(c(a))
我得到的错误是
Invalid use of Function(<built-in function contains>) with argument(s) of type(s): (array(int8, 1d, C), Literal[int](9))
* parameterized
In definition 0:
All templates rejected with literals.
In definition 1:
All templates rejected without literals.
In definition 2:
All templates rejected with literals.
In definition 3:
All templates rejected without literals.
In definition 4:
All templates rejected with literals.
In definition 5:
All templates rejected without literals.
This error is usually caused by passing an argument of a type that is unsupported by the named function.
[1] During: typing of intrinsic-call at .\emptyList.py (6)
如何在保持性能的同时解决这个问题?
将检查数组是否有两个值,1 和 -1,长度为 32 项。它们未排序。
检查数组中是否有两个值
为了仅检查两个值是否出现在数组中,我建议使用简单的暴力算法。
代码
import numba as nb
import numpy as np
@nb.njit(fastmath=True)
def isin(b):
for i in range(b.shape[0]):
res=False
if (b[i]==-1):
res=True
if (b[i]==1):
res=True
return res
#Parallelized call to isin if the data is an array of shape (n,m)
@nb.njit(fastmath=True,parallel=True)
def isin_arr(b):
res=np.empty(b.shape[0],dtype=nb.boolean)
for i in nb.prange(b.shape[0]):
res[i]=isin(b[i,:])
return res
性能
#Create some data (320MB)
A=(np.random.randn(10000000,32)-0.5)*5
A=A.astype(np.int8)
res=isin_arr(A) 11ms per call
因此,通过这种方法,我获得了大约 29GB/s 的吞吐量,这与内存带宽相差不远。您还可以尝试减少 Testdatasize,使其适合 L3 缓存以避免内存带宽限制。使用 3.2 MB 的测试数据,我得到了 100 GB/s 的吞吐量(远远超出了我的内存带宽),这清楚地表明此实现是内存带宽受限的。
这只是 max9111 的答案的细微变化。更短一点,并将要搜索的元素作为参数。一旦找到元素,它也会退出循环。
from numba import njit
@njit
def isin(val, arr):
for i in range(len(arr)):
if arr[i] == val:
return True
return False
我正在尝试检查一个数字是否在 int8
的 NumPy 数组中。我试过这个,但它不起作用。
from numba import njit
import numpy as np
@njit
def c(b):
return 9 in b
a = np.array((9, 10, 11), 'int8')
print(c(a))
我得到的错误是
Invalid use of Function(<built-in function contains>) with argument(s) of type(s): (array(int8, 1d, C), Literal[int](9))
* parameterized
In definition 0:
All templates rejected with literals.
In definition 1:
All templates rejected without literals.
In definition 2:
All templates rejected with literals.
In definition 3:
All templates rejected without literals.
In definition 4:
All templates rejected with literals.
In definition 5:
All templates rejected without literals.
This error is usually caused by passing an argument of a type that is unsupported by the named function.
[1] During: typing of intrinsic-call at .\emptyList.py (6)
如何在保持性能的同时解决这个问题? 将检查数组是否有两个值,1 和 -1,长度为 32 项。它们未排序。
检查数组中是否有两个值
为了仅检查两个值是否出现在数组中,我建议使用简单的暴力算法。
代码
import numba as nb
import numpy as np
@nb.njit(fastmath=True)
def isin(b):
for i in range(b.shape[0]):
res=False
if (b[i]==-1):
res=True
if (b[i]==1):
res=True
return res
#Parallelized call to isin if the data is an array of shape (n,m)
@nb.njit(fastmath=True,parallel=True)
def isin_arr(b):
res=np.empty(b.shape[0],dtype=nb.boolean)
for i in nb.prange(b.shape[0]):
res[i]=isin(b[i,:])
return res
性能
#Create some data (320MB)
A=(np.random.randn(10000000,32)-0.5)*5
A=A.astype(np.int8)
res=isin_arr(A) 11ms per call
因此,通过这种方法,我获得了大约 29GB/s 的吞吐量,这与内存带宽相差不远。您还可以尝试减少 Testdatasize,使其适合 L3 缓存以避免内存带宽限制。使用 3.2 MB 的测试数据,我得到了 100 GB/s 的吞吐量(远远超出了我的内存带宽),这清楚地表明此实现是内存带宽受限的。
这只是 max9111 的答案的细微变化。更短一点,并将要搜索的元素作为参数。一旦找到元素,它也会退出循环。
from numba import njit
@njit
def isin(val, arr):
for i in range(len(arr)):
if arr[i] == val:
return True
return False