Оптимальный способ найти индекс первого появления подмассива в каждом кадре пакетных данных без цикла for - PullRequest
0 голосов
/ 14 февраля 2019

Мне нужно найти индекс первого появления подмассива в каждом кадре. Размер данных (batch_size, 400).Мне нужно найти индекс появления трех последовательных в каждом кадре размером 400. Данные-> [0 0 0 1 1 1 0 1 1 1 1 1][0 0 0 0 1 1 1 0 0 1 1 1] [0 1 1 1 0 0 0 1 1 1 1 1]

вывод должен быть [3 4 1]

Собственное решение использует цикл forно так как данные большие, это очень много времени.

любая реализация в numpy или tensorflow, которая быстра и эффективна

1 Ответ

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

Для этого не существует простого простого решения.Однако то, что вы можете сделать, если вам действительно нужно, чтобы это было быстро, - это использовать numba :

Функция find_first в основном делает то, что вы делаете с циклом for.Но так как вы используете numba, метод компилируется, таким образом, намного быстрее.Затем вы просто применяете метод к каждой партии, используя np.apply_along_axis:

import numpy as np
from numba import jit


@jit(nopython=True)
def find_first(seq, arr):
    """return the index of the first occurence of item in arr"""
    for i in range(len(arr)-2):
        if np.all(seq == arr[i:i+3]):
            return i
    return -1

# construct test array
test = np.round(np.random.random((64,400)))

# this will give you the array of indices
np.apply_along_axis(lambda m: find_first(np.array([1,1,1]), m), axis=1, arr = test)

Я изменил метод с этот ответ

...