Оконные значения из двумерного массива - PullRequest
0 голосов
/ 03 мая 2019

У меня есть двумерный массив значений, А.Я хочу, чтобы окно значений в этом массиве вокруг индекса, заданного одномерного массива, б.

import numpy as np
A = np.random.randint(1000, size=(100, 100))
b = np.random.randint(40,60, size=(100))
window = A[b[:]-10 : b[:]+10, :]

Однако при выполнении этого я получаю следующую ошибку:

TypeError: в скаляры Python могут быть преобразованы только массивы размера 1

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

По сути, я хочу взять значения A для каждого столбца, которые находятся в 20-строчном окне около b.

print(b[:]-10,:)

дает:

[47 40 46 30 42 36 48 33 37 41 49 31 41 40 39 48 39 48 42 37 48 37 31 32 49 43 32 39 45 41 30 48 30 46 3139 48 44 36 30 40 45 47 34 49 46 41 43 30 38 31 35 42 48 49 42 32 33 42 48 48 39 31 32 45 39 36 49 31 44 48 30 33 47 33 48 36 38 42 30 49 43 41 34 3949 39 45 42 38 39 45 47 40 46 35 41 39 47 38]

print(b[:]+10,:)

дает:

[67 60 66 50 62 56 68 53 57 6169 51 61 60 59 68 59 68 62 57 68 57 51 52 69 63 52 59 65 61 50 68 50 66 51 59 68 64 56 50 60 65 67 54 69 61 63 50 58 51 55 62 68 69 62 52 53 62 6868 59 51 52 65 59 56 69 51 64 68 50 53 67 53 68 56 58 62 50 69 63 61 54 59 69 59 65 62 58 59 65 67 60 66 55 61 59 67 58]

Я хотел бы создать новый 2D-массив, который содержит значения из A в этом окне строк.

1 Ответ

0 голосов
/ 03 мая 2019

IIUC вот один из способов подойти к этому:

A = np.random.randint(1000, size=(100, 100))
b = np.random.randint(40,60, size=(100))

Где b может быть:

array([49, 47, 40, 44, 53, 47...

Итак, например, b[0], IIUC вы хотите индексировать A[0] из столбцов 39:59, A[1] из 37:57 и т. Д. Итак, прежде всего, давайте создадим ndarray, который будет использоваться к индексу A:

ar = np.arange(-10, 11)
ix = np.add.outer(b,ar)

array([[39, 40, 41, ..., 57, 58, 59],
       [37, 38, 39, ..., 55, 56, 57],
       [30, 31, 32, ..., 48, 49, 50],
       ...,

Теперь мы можем использовать ix для индексации A и получить массив (100, 20) со столбцами интереса в каждой строке. Для этого мы можем использовать расширенное индексирование :

A[np.arange(len(b))[:,None], ix][:,:-1]

array([[448, 963, 199, ...,  40, 300, 623],
       [258, 905, 862, ..., 517, 671, 399],
       [629, 408,  83, ..., 490, 883,  68],
       ...,
       [188, 368, 598, ..., 579, 925, 739],
       [131, 318,  28, ..., 444, 487, 362],
       [135, 801, 123, ..., 308, 579,  41]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...