Удалить определенные индексы из 2D массива Numpy - PullRequest
0 голосов
/ 22 февраля 2019

Если у меня есть набор данных, который имеет форму (1000, 1000), и я знаю, что значения, которые мне нужны, содержатся в индексах (25: 888,11: 957), как бы мне было разделитьдве секции данных друг от друга?

Я не мог понять, как сделать так, чтобы np.delete () понравился конкретному 2D-случаю, и мне также нужны как хорошие, так и плохие участки данных для анализа,поэтому я не могу просто указать границы моего массива в пределах хороших индексов.

Я чувствую, что здесь есть простое решение, которого мне не хватает.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Допустим, ваш исходный массив 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]
0 голосов
/ 22 февраля 2019

Это как вы хотите разделить массив?

In [364]: arr = np.ones((1000,1000),int)                                        
In [365]: beta = arr[25:888, 11:957]                                            
In [366]: beta.shape                                                            
Out[366]: (863, 946)
In [367]: arr[:25,:].shape                                                      
Out[367]: (25, 1000)
In [368]: arr[888:,:].shape                                                     
Out[368]: (112, 1000)
In [369]: arr[25:888,:11].shape                                                 
Out[369]: (863, 11)
In [370]: arr[25:888,957:].shape                                                
Out[370]: (863, 43)

Я представляю квадрат с прямоугольником, вырезанным из середины.Этот прямоугольник легко указать, но кадр должен рассматриваться как 4 прямоугольника - если только он не описан с помощью маски отсутствующего.

Проверка того, что я получил все:

In [376]: x = np.array([_366,_367,_368,_369,_370])                              
In [377]: np.multiply.reduce(x, axis=1).sum()                                   
Out[377]: 1000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...