Поддерживать 2D структуру после логической индексации массива - PullRequest
0 голосов
/ 15 апреля 2019

Я отслеживаю динамически меняющуюся маску, которая катится с использованием некоторого входного смещения. Эта маска хранит значения, которые определяют, где я могу доверять значениям в другом массиве той же формы. Пример изменения маски на каждой итерации приведен ниже. У меня есть большой стек логических проверок, которые определяют, как установить свернутые части маски на ноль, основываясь на том, равны ли значения сдвига x и y 0 или положительны или отрицательны. Здесь я просто запрограммировал все это для ясности.

import numpy as np
mask = np.full((8,8), 10)

#Iteration 1
mask = np.roll(mask, (0, 1), axis = (0,1))
mask[:, :1] = 0
#logical indexing happens here
mask += 1
print (mask)

#Iteration 2
mask = np.roll(mask, (1, 0), axis = (0,1))
mask[:1, :] = 0
#logical indexing happens here
mask +=1
print (mask)

#Iteration 3
mask = np.roll(mask, (2, -1), axis = (0,1))
mask[:, -1:] = 0
mask[:2, :] = 0
#logical indexing happens here
mask +=1
print (mask)

После каждой итерации и до того, как маска увеличивается на единицу, мне нужно индексировать и извлекать значения второго массива, где маска превышает некоторый порог (в данном случае 10). Поскольку я перевожу и устанавливаю значения, я всегда знаю, что часть маски, которая удовлетворяет этому условию, может быть передана в 2d массив. Ниже приведен упрощенный пример того, что я делаю, где arr2 - плоский массив.

import numpy as np

arr1 = np.arange(0, 64, 1).reshape((8,8))
mask = np.full((8,8), 10)
mask[:, 0] = 0

arr2 = arr1[mask >= 10]

Как я могу сохранить arr2 как двумерный массив, где маска выше установленного порога?

Я априори не знаю, какой будет сдвиг, который применяется к маске, поэтому мне приходится полагаться на значения в маске, чтобы определить форму результирующего массива. Мои массивы намного больше, чем в этом примере, и сдвиги находятся в диапазоне от -5 до 5, поэтому я знаю, что не подойду близко к установке всего массива ниже порогового значения. Идея состоит в том, что после ~ 10 итераций некоторые части массива снова становятся заслуживающими доверия и могут быть полезной информацией после логического индекса.

1 Ответ

0 голосов
/ 04 июня 2019

Ответ здесь - обходной путь, и теперь он стал очевиден, так как он какое-то время кипел в моей голове. По сути, поскольку я знаю, что полученная площадь будет квадратной, я могу просто сосчитать по строке и столбцу, где каждый индекс соответствует моему условию. Итак, продолжая мой пример, прежде чем я просто добавлю пару строк, чтобы определить, сколько значений в строке и столбце соответствует моему условию.

import numpy as np
#Initializing array
arr1 = np.arange(0, 64, 1).reshape((8,8))
#mask array
mask = np.full((8,8), 10)

#Setting some rows and cols to zero to simulate my roll functionality
mask[:, 0] = 0
mask[:2, :] = 0

#Summing across a row and col where condition is met
sizex = np.sum(mask[4, :] >= 10)
sizey = np.sum(mask[:, 4] >= 10)

#Using the mask to index into the original array and reshaping
arr2 = arr1[mask >= 10].reshape((sizey, sizex))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...