Объединение двух представлений одного и того же массива в одно представление без копирования массива? - PullRequest
0 голосов
/ 14 мая 2018

У меня есть большой двумерный массив, и я хочу удалить его подмножества и обработать то, что осталось функции. Мне нужно сделать это для многих подмножеств, и, таким образом, в идеале я бы не хотел создавать копию массива каждый раз. Функция не меняет никаких значений в массиве.

mat = np.load(filename)
mat_1 = mat[:i,:]
mat_2 = mat[j:,:]

Пока что mat_1 и mat_2 являются представлениями. Тогда я хотел бы сделать

mat_s = np.concatenate((mat_1,mat_2))
result = func(mat_s)

но без копирования. Это возможно?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Поскольку представления памяти могут быть созданы только с использованием фиксированного набора strides, вам придется создать копию в вашем случае, где mat.shape[0] > j > i.

Это означает, что представления будут работать, только если вы хотите иметь представление для каждого x-го элемента в массиве:

mat = np.arange(20)
view = mat[slice(0, 20, 4)]
view
# Out[41]: array([ 0,  4,  8, 12, 16])

Так что это работает только для представлений с одинаково расположенными ячейками. Но если вы хотите просмотреть один смежный slice(0, i) и другой смежный slice(j, mat.shape[0]), он не сработает. Вам нужно будет сделать копию.

0 голосов
/ 14 мая 2018

Вы можете удалить строки, которые хотите удалить, и передать их непосредственно в функцию.

mat = np.load(filename)
mat_s = np.delete(mat,list(range(i,j)),axis=0)

. Вы можете удалить 2 поднабора разности, добавив список диапазонов, например

mat_s = np.delete(mat,list(range(i,j))+list(range(k,l)),axis=0)
* 1006.* вышеприведенное удаляет строки i: j и k: l
...