Цикл по матрице nxn с меньшей матрицей определенного размера с массивами - PullRequest
0 голосов
/ 21 апреля 2019

В настоящее время у меня возникает следующая проблема, учитывая массив, скажем для простоты, массив 4 x 4 (на самом деле я работаю с 512 x 512)

X = np.array([[3, 5, 2, 4],
              [7, 6, 8, 8],
              [1, 6, 7, 7],
              [2, 1, 3, 4]])

Я хотел бы зациклить /скользить по массиву таким образом, чтобы я мог сохранять новые массивы в форме

np.array([3,5],[7,6]), np.array([2,4], [8,8]), np.array([1,6],[2,1]), np.array ([7,7],[1,4]) и т. д. (в идеале, чтобы я мог выбрать шаг и размер моего «скользящего» окна).Также я хотел бы выбрать эти массивы в соответствии с некоторыми условиями, см. Ниже.

На данный момент мне удалось сделать почти все, разрезав (см. Код) мою матрицу.Это дает правильное срезание с шагом, который я хочу, затем, используя модуль itertools, я могу перебрать все свои списки списков, сосчитать элементы меньше определенного значения и сохранить их.Что я не могу сделать, так это связать индексы между всеми этими новыми списками вместе с основной матрицей.По этой причине я думал переместить все в numpy массивы, которые должны (по моему мнению) быть намного более эффективными с точки зрения вычислений, и я думаю, что должен решить мою проблему индексов.Теперь единственная проблема заключается в том, что я не знаю, как решить эту проблему для произвольной матрицы n x n.

X = np.array([[3, 5, 2, 4],
          [7, 6, 8, 8],
          [1, 6, 7, 7],
          [2, 1, 3, 4]])

width = len(m[0])
height = len(m)
height = 2  # size of the matrix sliding
width = 2
for i in range(0, height - slice_y + 1,2):
    for j in range(0, width - slice_x + 1,2):

        Appended.append(
                [
                    [m[a][b] for b in range(j, j + slice_x)]
                    for a in range(i, i + slice_y)
                ]

            )

В идеале мне бы хотелось, чтобы это была общая матрица N x N, но на данный момент такжетолько как в примере, чтобы получить выходные данные в виде массивов, таких как:

np.array([3,5],[7,6]) .  np.array ([2,4], [8,8])  ,  np.array  ([1,6],[2,1]),   np.array ([7,7],[1,4])

И, скажем, однажды обнаружили, что, например, массив np.array([2,4], [8,8]) имеет два элемента больше, чем 7, а сумма большечем 20, чтобы сохранить координаты этого массива относительно моей исходной матрицы.Таким образом, сохраняя пары индексов X[0][2], X[0][3], X[1][2], X[1][3] или, по крайней мере, первые X[0][2], так что, зная шаг моего "окна", я могу получить доступ к своим подмассивам, проиндексировав основную матрицу.

1 Ответ

0 голосов
/ 21 апреля 2019

Очевидно, что вы можете напрямую нарезать массивы numy

X = np.array([[3, 5, 2, 4],
      [7, 6, 8, 8],
      [1, 6, 7, 7],
      [2, 1, 3, 4]])[0:2,0:2]

Я бы в вашем случае сгенерировал список индексов ребер подматрицы, которую вы собираетесь использовать.Затем используйте это, чтобы сгенерировать список подматриц, затем используйте это, чтобы сгенерировать список истинных или ложных значений, основанных на подматрицах.Затем вы можете использовать этот список значений true / false для сокращения вашего первоначального списка признаков.Вы также можете сделать это, не сохраняя подматрицы вообще.

indicies= [((i,i+s_width),(j,j+s_height)) for i in range(0,width-s_width) for j in range(0,height-s_height)]
...