Значение Python Numba в массиве - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь проверить, находится ли число в массиве NumPy int8 с.Я попробовал это, но это не работает.

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 элемента.Они не отсортированы.

1 Ответ

0 голосов
/ 28 февраля 2019

Проверка наличия двух значений в массиве

Для проверки наличия только двух значений в массиве я бы порекомендовал простой алгоритм перебора.

Код

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

Таким образом, с помощью этого метода я получаю пропускную способность около 29 ГБ / с, что недалеко от полосы пропускания памяти.Вы также можете попытаться уменьшить размер тестовых данных, чтобы они помещались в кэш-памяти L3, чтобы избежать ограничения полосы пропускания памяти.С 3,2 МБ тестовых данных я получаю throuput 100 ГБ / с (намного выше моей пропускной способности памяти), что является четким показателем того, что эта реализация ограничена пропускной способностью памяти.

...