Борьба с вложенным массивом Numpy при реализации Numba - PullRequest
0 голосов
/ 21 января 2020

У меня есть массив Numpy, содержащий информацию из 56 рентгеновских лучей (arr1, Array of float32) с одним столбцом, содержащим 56 массивов [95200,2] (arr2, Array of object), связанных с arr1. Моя цель состоит в том, чтобы перебрать оба массива и создать новый массив, содержащий информацию из arr1 для каждой строки в arr2 (arr_out).

Как способ практики я Я хотел бы реализовать Numba, чтобы ускорить процесс, однако, это приводит к ошибкам Numba, которые мне трудно решить.

Если я правильно понимаю, это в основном вызвано arr2, так как это массив объектов, однако я не могу заставить себя работать над решением.

Может ли кто-нибудь дать мне пу sh?

Мой текущий код;

@numba.jit
def fill():
    arr_out = np.empty((0,6))
    row, column = arr1.shape
    for row in range(0,row):
        print('Row number: {}'.format(row))
        matrix = arr2[row]
        matrix_rows = len(matrix)-1

        for m_row in range(0, matrix_rows):
            inp_arr = [np.hstack((arr1[row, 0:4],matrix[matrix_row]))]
            arr_out = np.vstack((arr_out, inp_arr))

    return arr_out

Edit : Я забыл показать предупреждения;

Compilation is falling back to object mode WITH looplifting enabled because Function "fillspec" failed type inference due to: Untyped global name 'arr2': Unsupported array dtype: object

File "<ipython-input-44-7e98fec24979>", line 7:
def fillspec():
    <source elided>
        print('Row number: {}'.format(row))
        matrix = arr2[row]

Есть и другие, но если я правильно понимаю, они связаны с этим первоначальным предупреждением. (Я не чувствую, что дамп предупреждения добавит к моему вопросу:))

(термин «вложенный массив» в этом случае правильный?)

Edit 2 : Как указано, определение arr2, скорее всего, важно; Чтобы определить arr1 как float, я вынул arr2 как таковой;

arr2 = arr_orig[:,8]
arr1 = np.delete(arr_orig,8, axis=1)
arr1  = arr1.astype(np.float32)

Это оставляет arr2 как массив объектов, однако вложенные массивы внутри arr2 определены как float.

1 Ответ

0 голосов
/ 21 января 2020

Спасибо @hpaulj за удивление, я пытался справиться с простой проблемой.

Мое решение состоит в том, чтобы поместить каждый список результатов l oop в список, после закрытия циклов список затем преобразуется в массив. Там, где это сначала было длинным, теперь это занимает не более 2 минут (что делает меня несколько подозрительным;)).

Спасибо за помощь всем!

Sidenote; Я положил таймер на петли и заметил, что время увеличивается для каждого l oop. Это в сочетании с ужасом @ hpaulj побудило меня восстановить.

...