Удаление столбцов в зависимости от состояния с помощью NumPy - PullRequest
0 голосов
/ 14 февраля 2019

Я провел серию экспериментов, после завершения которых я понял, что определенное количество из них ненадежно, поэтому я хотел бы удалить их.Для этой цели я решил добавить еще один массив status, в котором столбцы, которые я хотел бы сохранить, определены как True, тогда как те, которые я хочу удалить, обозначены как False.

* 1005.*

В самом простом случае проблем нет, и кажется, что он работает так, как задумано, обеспечивая следующий вывод:

[2, 4, 5, 6, 7, 8, 9, 11, 12, 13]

Однако я работаю с несколькими наборами данных (не только с одним,в этом случае data_a).Поэтому я решил сделать это немного сложнее, добавив два новых массива:

data_b = np.arange(101,114)
data_c = np.arange(1001,1014)

test = []
for datasets in (data_a, data_b, data_c):
    for stats, sets in zip(status, datasets):
        if stats == True:
            datasets = sets
            test.append(datasets)
        elif stats == False:
            pass
        else:
            print('Impossible -- in the case of status, there exist only two conditionals (True or False).')

Этот немного более сложный случай дает:

[2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 102, 104, 105, 106, 107, 108, 109, 111, 112, 113, 1002, 1004, 1005, 1006, 1007, 1008, 1009, 1011, 1012, 1013]

Он сделал то, что я просил, ночто мне нужно сделать для того, чтобы data_a, data_b и data_c сохранялись как массивы независимо?

В наиболее сложном случае (а также реалистично для того, что я на самом деле делаю),мои наборы данных на самом деле массивы с формой (11,13):

data_a = []
data_b = []
data_c = []

for dtlsts in (data_a, data_b, data_c):
    for _ in range(11):
        dtlsts.append(np.random.randint(0, 10, 13))

data_a = np.array(data_a)
data_b = np.array(data_b)
data_c = np.array(data_c)

Таким образом, я хотел бы:

  • Удалить столбцы на основе массива состояния, такЯ получаю массивы с формой (11,10).

  • Храните эти массивы независимо (т. Е. data_a, data_b и data_c хранятся в независимых (11,10) массивах).

Я нахожусь на глубокой воде и буду очень признателен за помощь.Спасибо.

Ответы [ 2 ]

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

Чтобы расширить комментарий @ Эндрю, вы можете индексировать целые столбцы с помощью логической маски следующим образом.

In [120]: data_a = np.arange(1,14)
     ...: status = np.array([False, True, False, True, True, True, True, True, True, False, True, True, True])
     ...: 
     ...: 
In [121]: data_a
Out[121]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13])
In [122]: data_a[status]
Out[122]: array([ 2,  4,  5,  6,  7,  8,  9, 11, 12, 13])

Для двумерного массива настройте индексирование:

In [123]: data_b = np.vstack([data_a,data_a,data_a])
In [124]: data_b[:,status]
Out[124]: 
array([[ 2,  4,  5,  6,  7,  8,  9, 11, 12, 13],
       [ 2,  4,  5,  6,  7,  8,  9, 11, 12, 13],
       [ 2,  4,  5,  6,  7,  8,  9, 11, 12, 13]])
0 голосов
/ 14 февраля 2019

Если я понимаю вопрос, вы можете сделать что-то вроде этого:

test = [ [] for _ in range(3) ]
for i, state in enumerate(status):
  if state:
    test[0].append(data_a[i])
    test[1].append(data_b[i])
    test[2].append(data_c[i])

print(test)
#=> [[2, 4, 5, 6, 7, 8, 9, 11, 12, 13], [102, 104, 105, 106, 107, 108, 109, 111, 112, 113], [1002, 1004, 1005, 1006, 1007, 1008, 1009, 1011, 1012, 1013]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...