Используйте numpy.frompyfunc для добавления трансляции в функцию python с аргументом

Из массива вродеdb (который будет примерно(1e6, 300)) иmask = [1, 0, 1] вектор, я определяю цель как 1 в первом столбце.

Я хочу создатьout вектор, который состоит из тех, где соответствующая строка вdb соответствуетmask а такжеtarget==1и нули повсюду.

db = np.array([       # out for mask = [1, 0, 1]
# target,  vector     #
  [1,      1, 0, 1],  # 1
  [0,      1, 1, 1],  # 0 (fit to mask but target == 0)
  [0,      0, 1, 0],  # 0
  [1,      1, 0, 1],  # 1
  [0,      1, 1, 0],  # 0
  [1,      0, 0, 0],  # 0
  ])

Я определилvline функция, которая применяетmask к каждой строке массива, используяnp.array_equal(mask, mask & vector) чтобы проверить, что векторы 101 и 111 соответствуют маске, то сохраняются только индексы, гдеtarget == 1.

out инициализируется вarray([0, 0, 0, 0, 0, 0])

out = [0, 0, 0, 0, 0, 0]

vline функция определяется как:

def vline(idx, mask):
    line = db[idx]
    target, vector = line[0], line[1:]
    if np.array_equal(mask, mask & vector):
        if target == 1:
            out[idx] = 1

Я получаю правильный результат, применяя эту функцию построчно вfor цикл:

def check_mask(db, out, mask=[1, 0, 1]):
    # idx_db to iterate over db lines without enumerate
    for idx in np.arange(db.shape[0]):
        vline(idx, mask=mask)
    return out

assert check_mask(db, out, [1, 0, 1]) == [1, 0, 0, 1, 0, 0] # it works !

Теперь я хочу векторизоватьvline создаваяufunc:

ufunc_vline = np.frompyfunc(vline, 2, 1)
out = [0, 0, 0, 0, 0, 0]
ufunc_vline(db, [1, 0, 1])
print out

Ноufunc жалуется на трансляцию входных данных с такими формами:

In [217]:     ufunc_vline(db, [1, 0, 1])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-217-9008ebeb6aa1> in <module>()
----> 1 ufunc_vline(db, [1, 0, 1])
ValueError: operands could not be broadcast together with shapes (6,4) (3,)
In [218]:

Ответы на вопрос(1)

Ваш ответ на вопрос