Как исключить конкретные строки из массива? - PullRequest
0 голосов
/ 26 февраля 2019

Я работаю над инструментом для анализа погодных данных.В этот момент все данные загружаются в матрицу × 10 с именем master_array, содержащую данные в виде типа float64.Я построил несколько фильтров, позволяющих пользователю указывать годы и месяцы, которые следует использовать для дальнейших вычислений.Эти фильтры генерируют списки, например, список, содержащий целые числа, такие как years=[2008, 2009, 2010] за годы с 2008 по 2010 год или другой список months=[8, 9, 10] за август-октябрь.Последний столбец master_array содержит годы, когда были собраны данные, столбец перед месяцами и т. Д.

С чем я сейчас борюсь, чтобы создать функцию, которая проверяет последний столбец master_array для любых совпадений с элементами списка years и удалите все строки из master_array, которые не совпадают.Если список years пуст, на данный момент все доступные данные должны храниться в master_array.

Следующий шаг будет в основном таким же, но со столбцом перед последним столбцом в master_array и, конечно,используя список months вместо years.

Я не могу гарантировать, что значения в master_array отсортированы, но функция должна фильтровать матрицу, тем не менее.

IЯ почти уверен, что должен использовать numpys delete () и argwhere (), но я открыт для любого простого и аккуратного решения, которое поможет с этой проблемой.

Заранее спасибо.

Редактировать:
Для меня очень важно сохранить master_array или хотя бы его копию и удалить ненужные строки вместо создания нового массива с помощью vstack или чего-то подобного.

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Спасибо всем за ваш совет.Я наконец решил свою проблему, не используя комбинацию delete () и argwhere ().Сначала я использовал панд, но потом понял, что в этом нет необходимости.Короче говоря, я использую дополнение к спискам months и years (конечно, для этого требуется знать, каков максимальный период времени для набора данных [см., Например, список all_years в примере ниже), что не проблема, так как все это включено в мой master_array), и с помощью дополнения, которого я могу добиться, чтобы исключить каждую строку из master_array, которая не соответствует фильтрам, наконец, именно то, что я искал!

Чтобы привести пример окончательного кода:

for i in [x for x in all_years if x not in years]: #list containing the complement to the years chosen by user as filter
    master_arrayFilter = master_arrayFilter[master_arrayFilter[:,9] != i]

Обратите внимание, что я создал "копию" master_array с именем master_arrayFilter в предыдущей строке.

Все еще потрясающечто эти две строки делают работу!:)

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

Вы можете использовать маску с np.isin, затем заменить массив на маску. Это рекомендуемый метод от numpy :

Часто предпочтительнее использовать логическую маску.Например:

mask = np.ones (len (arr), dtype = bool) mask [[0,2,4]] = Ложный результат = arr [mask, ...]

Эквивалентно np.delete(arr, [0,2,4], axis=0), но допускает дальнейшее использование mask.

Пример:

import numpy as np

#step 1: create an array with values and years (for illustration)
values = np.random.random(10)
years = np.array([2001, 2002, 2002, 2003, 2001,
                  2004, 2005, 2001, 2009, 2008])
master = np.vstack((values, years)).T
print(master[:,1])   # this will print master second column, i.e. years
>> ([2001, 2002, 2002, 2003, 2001, 2004, 2005, 2001, 2009, 2008])

# step 2: specify what years I want, then filter using a mask
filt_years = [2001, 2002]
mask = np.isin(master[:,1], filt_years)
print(mask)   #False values will be deleted
>> [ True  True  True False  True False False  True False False]

#step 3: apply mask and replace master (easier than deleting)
master = master[mask]
# or if you want to use delete:
master = np.delete(master, np.arange(len(master))[~mask], axis=0)

Пример объединения лет и месяцев и использования logical_and (т.е. месяцы и годы должны быть в выбранных наборах):

months = np.array([1,1,2,2,1,4,5,8,9,5])
master = np.vstack((values, months, years)).T
filt_years = [2001, 2002]
filt_months = [1,2]
mask = np.logical_and(np.isin(master[:,2], filt_years), np.isin(master[:,1], filt_months))
master = master[mask]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...