Допустим, ваш исходный массив numy: my_arr
Извлечение раздела "Good":
Это просто, потому что хороший раздел имеет прямоугольную форму.
good_arr = my_arr[25:888, 11:957]
Извлечение «плохого» раздела:
«Плохой» раздел не имеет прямоугольной формы.Скорее, он имеет форму прямоугольника с вырезанным из него прямоугольным отверстием.
Таким образом, вы не можете действительно хранить «плохой» раздел отдельно, в любой массивоподобной структуре, если только вы ненормально, тратя дополнительное пространство на обработку вырезанной части.
Какие у вас есть варианты для "плохого" раздела?
Вариант 1: Будьте счастливы и довольны тем, что извлекли хороший раздел.Пусть плохой раздел останется частью оригинала my_arr
.Итерируя через my_arr
, вы всегда можете различить хорошие и плохие предметы на основе индексов.Недостатком является то, что всякий раз, когда вы хотите обработать только плохие предметы, вы должны делать это через вложенный двойной цикл, а не использовать некоторые векторизованные функции numpy.
Опция 2: Предположим, что мы хотим выполнить некоторые операции, такие как итоговые итоги по строкам или итоги по столбцам только с плохими элементами в my_arr
, и предположим, что вы не хотите использовать накладные расходы для вложенных циклов for.Вы можете создать нечто, называемое массивом с маскировкой.С помощью маскированного массива вы можете выполнять большинство обычных операций с numpy, и numpy автоматически исключает замаскированные элементы из вычислений.Обратите внимание, что внутренне будут происходить некоторые потери памяти, просто для сохранения элемента как «замаскированного» * 1032 *
Приведенный ниже код иллюстрирует, как вы можете создать замаскированный массив с именем masked_arr
из исходного массива my_arr
:
import numpy as np
my_size = 10 # In your case, 1000
r_1, r_2 = 2, 8 # In your case, r_1 = 25, r_2 = 889 (which is 888+1)
c_1, c_2 = 3, 5 # In your case, c_1 = 11, c_2 = 958 (which is 957+1)
# Using nested list comprehension, build a boolean mask as a list of lists, of shape (my_size, my_size).
# The mask will have False everywhere, except in the sub-region [r_1:r_2, c_1:c_2], which will have True.
mask_list = [[True if ((r in range(r_1, r_2)) and (c in range(c_1, c_2))) else False
for c in range(my_size)] for r in range(my_size)]
# Your original, complete 2d array. Let's just fill it with some "toy data"
my_arr = np.arange((my_size * my_size)).reshape(my_size, my_size)
print (my_arr)
masked_arr = np.ma.masked_where(mask_list, my_arr)
print ("masked_arr is:\n", masked_arr, ", and its shape is:", masked_arr.shape)
Вывод вышеприведенного:
[[ 0 1 2 3 4 5 6 7 8 9]
[10 11 12 13 14 15 16 17 18 19]
[20 21 22 23 24 25 26 27 28 29]
[30 31 32 33 34 35 36 37 38 39]
[40 41 42 43 44 45 46 47 48 49]
[50 51 52 53 54 55 56 57 58 59]
[60 61 62 63 64 65 66 67 68 69]
[70 71 72 73 74 75 76 77 78 79]
[80 81 82 83 84 85 86 87 88 89]
[90 91 92 93 94 95 96 97 98 99]]
masked_arr is:
[[0 1 2 3 4 5 6 7 8 9]
[10 11 12 13 14 15 16 17 18 19]
[20 21 22 -- -- 25 26 27 28 29]
[30 31 32 -- -- 35 36 37 38 39]
[40 41 42 -- -- 45 46 47 48 49]
[50 51 52 -- -- 55 56 57 58 59]
[60 61 62 -- -- 65 66 67 68 69]
[70 71 72 -- -- 75 76 77 78 79]
[80 81 82 83 84 85 86 87 88 89]
[90 91 92 93 94 95 96 97 98 99]] , and its shape is: (10, 10)
Теперь, когда у вас есть массив с маской, вы сможете выполнять с ним большинство операций с NumPy, и NUMPY будетавтоматически исключать замаскированные элементы (те, которые отображаются как «--
» при печати масочного массива)
Некоторые примеры того, что вы можете сделать с замаскированным массивом:
# Now, you can print column-wise totals, of only the bad items.
print (masked_arr.sum(axis=0))
# Or row-wise totals, for that matter.
print (masked_arr.sum(axis=1))
Выходные данные выше:
[450 460 470 192 196 500 510 520 530 540]
[45 145 198 278 358 438 518 598 845 945]