сжатие массива numpy (матрицы) путем удаления столбцов с использованием другого массива numpy в качестве маски - PullRequest
6 голосов
/ 10 декабря 2011

У меня есть двумерный массив numpy (т. Е. Матрица) A, который содержит полезные данные, разбросанные по мусору в виде векторов столбцов, а также массив выбора B, который содержит «1» для этих столбцов. которые важны и 0 для тех, которые не являются. Есть ли способ выбрать только те столбцы из A, которые соответствуют столбцам в B? у меня есть матрица

A = array([[ 0,  1,  2,  3,  4],   and a vector B = array([ 0,  1,  0,  1,  0])
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14],
           [15, 16, 17, 18, 19],
           [20, 21, 22, 23, 24]])

а я хочу

array([[1,   3],
       [6,   8],
       [11, 13],
       [16, 18],
       [21, 23]])

Есть ли элегантный способ сделать это? Прямо сейчас у меня есть цикл for, который перебирает B.

ПРИМЕЧАНИЕ: матрицы, с которыми я имею дело, большие, поэтому я не хочу использовать массивные массивы, поскольку я просто не хочу замаскированных данных

Ответы [ 3 ]

8 голосов
/ 10 декабря 2011
>>> A
  array([[ 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]])
>>> B = NP.array([ 0,  1,  0,  1,  0])

>>> # convert the indexing array to a boolean array
>>> B = NP.array(B, dtype=bool)

>>> # index A against B--indexing array is placed after the ',' because
>>> # you are selecting columns

>>> res = A[:,B]

>>> res
  array([[ 1,  3],
         [ 6,  8],
         [11, 13],
         [16, 18],
         [21, 23]])  


Синтаксис нарезки на основе индекса в NumPy элегантен и прост. Пара правил охватывает большинство случаев использования:

  • форма [строки, столбцы]

  • указать все строки или все столбцы с помощью двоеточия ":", например, [:, 4] (извлекает весь 5-й столбец)

2 голосов
/ 10 декабря 2011

Не уверен, что это самый эффективный способ (из-за транспонирования), но он должен быть лучше, чем цикл for:

A.T[B == 1].T
0 голосов
/ 24 ноября 2012

Мне было интересно сделать то же самое, но чтобы разрезать строку и столбец, используя логические значения вектора B, решение было простым:

res = A[:,B][B,:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...