Трансляция 1D массива с использованием 2D массива - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть 1D массив array_data с ~ 10 ** 8 элементами.

У меня есть второй массив array_index, который задает связанные индексы, используемые для нарезки array_data с.

Ниже приведен минимальный, полный и проверяемый примерarray_data и array_index:

import numpy as np

#Create data
array_data = np.arange(100)

#Randomly create indices
array_index = np.sort(np.random.randint(100, size=(10,2)))

#For each randomly created index, slice the array
array_sliced = [array_data[index[0]:index[1]]) for index in array_index]

#Now data is sliced, perform operation on the sliced data. For example:
val = []
for slice in array_sliced:
    val.append(np.nanmean(slice))

Вопрос: Как лучше всего нарезать array_data с помощью array_index вдоль axis=1, чтобы я мог выполнить другую задачу нанарезанные массивы (например, min, max, mean)?

Мое решение на данный момент использует понимание списка и преобразование обратно в массив Numpy.Этот метод кажется неуклюжим и медленным:

>>> np.array([np.nanmean(array_data[index[0]:index[1]]) for index in array_index], dtype=np.float64)

РЕДАКТИРОВАТЬ: Добавлен пример Minimal, Complete и Verifiable (работает в python 2.7).

1 Ответ

0 голосов
/ 27 сентября 2018

Когда я запускаю ваш код, я получаю список массивов различного размера:

In [63]: [len(x) for x in array_sliced]
Out[63]: [3, 46, 38, 9, 73, 66, 3, 23, 40, 36]

(вы также получаете это из np.diff(array_index,axis=1))

Общее замечание заключается в том, что при работемассивов разных размеров, довольно трудно обрабатывать их любым способом.

Вы можете сгенерировать маску (10 100), True для значений, которые вы хотите сохранить в каждой строке, False дляпропуски.Или, возможно, np.nan для пропусков.

Или подумайте с точки зрения заполнения этих 10 массивов, чтобы они поместились в массив (10,73), опять же с соответствующим элементом заполнения (0, nan и т. Д.).

...