python получить несколько вложенных массивов в одной строке - PullRequest
0 голосов
/ 22 марта 2020

У меня есть следующее:

values = np.zeros(50)
for i, (start,stop) in enumerate(zip(index - margin, index + margin)):
    values[i] = np.mean(image[start:stop])

, где index - это массив 1d numpy, а margin - целое число. Я хотел бы быть в состоянии сделать для l oop в одну строку (или, по крайней мере, избежать для l oop), но я не могу понять, как. Действительно, если я сделаю:

myArray = np.array([1,2,3,4,5,6,7,8,9])
indexes = [1,5]
myArray[indexes] # Output : [2,6]

, это легко сработает, так как цель состоит в том, чтобы получить один элемент на индекс. Но я хочу извлечь подмассивы таким же образом. Есть ли решение?

РЕДАКТИРОВАТЬ : вот краткий пример того, что я хочу. Изображение представляет собой массив 1d, например np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]). если у меня есть, скажем, index = np.array([5, 10]) и margin = 1, я ожидаю output = np.array([[5,6,7],[10,11,12]]) (примерно так же, как если бы поле было равно 0, тогда у меня было бы output = np.array([6,11]))

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Похоже, вы хотите, чтобы среднее значение (выбранное) двигалось windows. Лишь для немногих (относительно общего размера) эта итерация, вероятно, является хорошей (и самой быстрой).

Но при использовании strides есть трюк с движущимся окном. Один из пакетов обработки изображений имеет функцию window, которую будут цитировать другие, но с самим numpy:

In [204]: x = np.lib.stride_tricks.as_strided(arr,shape=(14,3),strides=(8,8))                                        
In [205]: x                                                                                                          
Out[205]: 
array([[ 1,  2,  3],
       [ 2,  3,  4],
       [ 3,  4,  5],
       [ 4,  5,  6],
       [ 5,  6,  7],
       [ 6,  7,  8],
       [ 7,  8,  9],
       [ 8,  9, 10],
       [ 9, 10, 11],
       [10, 11, 12],
       [11, 12, 13],
       [12, 13, 14],
       [13, 14, 15],
       [14, 15, 16]])

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

In [206]: np.mean(x, axis=1)                                                                                         
Out[206]: 
array([ 2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12., 13., 14.,
       15.])
In [207]: _[[4,9]]        # 1 offset from [5,10]                                                                                           
Out[207]: array([ 6., 11.])

Получить правильные параметры для as_strided немного сложно, требуя хорошего понимания структуры массива. На самом деле это один из самых простых случаев, с массивом 1d и 1-шагом.

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

7 в ширину windows (просто измените форму):

In [211]: x = np.lib.stride_tricks.as_strided(arr, shape=(10,7), strides=(8,8))                                        
In [212]: x                                                                                                          
Out[212]: 
array([[ 1,  2,  3,  4,  5,  6,  7],
       [ 2,  3,  4,  5,  6,  7,  8],
       [ 3,  4,  5,  6,  7,  8,  9],
       [ 4,  5,  6,  7,  8,  9, 10],
       [ 5,  6,  7,  8,  9, 10, 11],
       [ 6,  7,  8,  9, 10, 11, 12],
       [ 7,  8,  9, 10, 11, 12, 13],
       [ 8,  9, 10, 11, 12, 13, 14],
       [ 9, 10, 11, 12, 13, 14, 15],
       [10, 11, 12, 13, 14, 15, 16]])
0 голосов
/ 22 марта 2020

Вы можете использовать ту же идею немного по-другому:

img = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])
index = np.array([5, 10])
margin = 1

output = np.array([(img[start:stop+1]) for start, stop in zip(index - margin, index + margin)])
output
array([[ 5,  6,  7],
       [10, 11, 12]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...