Как удалить столбец в массиве Numpy - PullRequest
0 голосов
/ 17 июня 2020

мой массив выглядит так (9 столбцов)

[('2012-07', 'abc', 'EXECUTIVE', '149', '16 TO 18', 150., 1995,'apt', 1000000)
 ('2012-10', 'abc', 'EXECUTIVE', '194', '22 TO 24', 163., 1987, 'ma',  1010000)
  ('2014-12', 'abc', 'EXECUTIVE', '190', '19 TO 21', 150., 1987, 'ma', 1000000)] 

print(a.shape)
output >> (3,)
print(len(a))
output >> 3

Я хочу удалить последний второй столбец, поэтому он будет выглядеть так

[('2012-07', 'abc', 'EXECUTIVE', '149', '16 TO 18', 150., 1995, 1000000)
 ('2012-10', 'abc', 'EXECUTIVE', '194', '22 TO 24', 163., 1987, 1010000)
  ('2014-12', 'abc', 'EXECUTIVE', '190', '19 TO 21', 150., 1987, 1000000)] 

Я пробовал np. функция удаления:

b = np.delete(a,7,axis=1)

Error >> AxisError: axis 1 is out of bounds for array of dimension 1

В моем массиве несколько строк с 9 столбцами, просто хочу удалить один столбец.

Любая помощь будет очень принята. Спасибо!

Ответы [ 4 ]

3 голосов
/ 17 июня 2020

a.shape: (3,), это означает, что на оси 0 только 3 элемента, оси 1 нет. Следует проверить, как данные вашей матрицы назначены.

import numpy as np

a = [('2012-07', 'abc', 'EXECUTIVE', '149', '16 TO 18', 150., 1995, 'apt', 1000000),
     ('2012-10', 'abc', 'EXECUTIVE', '194', '22 TO 24', 163., 1987, 'ma',  1010000),
     ('2014-12', 'abc', 'EXECUTIVE', '190', '19 TO 21', 150., 1987, 'ma',  1000000)]

b = np.array(a)

c = np.delete(b,7,axis=1)
0 голосов
/ 17 июня 2020

Ваш вывод из:

print(a.shape)
output >> (3,)

показывает, что массив numpy является одномерным. Он имеет 3 строки и 0 столбцов.

В зависимости от того, что вы хотите, shape должен возвращать (3,9), обозначающий 3 строки и 9 столбцов.

Вот как вы можете это сделать:

import numpy as np

original_array = np.array([('2012-07', 'abc', 'EXECUTIVE', '149', '16 TO 18', 150., 1995, 'apt', 1000000),
            ('2012-10', 'abc', 'EXECUTIVE', '194', '22 TO 24', 163., 1987, 'ma',  1010000),
            ('2014-12', 'abc', 'EXECUTIVE', '190', '19 TO 21', 150., 1987, 'ma',  1000000)])

Чтобы удалить второй последний элемент, вы можете использовать negative index:

new_array = np.delete(my_array, -2, axis=1)
0 голосов
/ 17 июня 2020

Первое, что следует отметить, это то, что у вас есть структурированный массив Numpy массив.

Он должен быть создан с параметром dtype, в противном случае все типы полей будут U ... (строки Unicode определенного размера). Я создал такой массив, работающий:

a = np.array([
    ('2012-07', 'abc', 'EXECUTIVE', '149', '16 TO 18', 150., 1995, 'apt', 1000000),
    ('2012-10', 'abc', 'EXECUTIVE', '194', '22 TO 24', 163., 1987, 'ma',  1010000),
    ('2014-12', 'abc', 'EXECUTIVE', '190', '19 TO 21', 150., 1987, 'ma',  1000000)],
    dtype='U7, U3, U10, i4, U10, f4, i4, U4, i4')

Обратите внимание, что даже если вы не передали имена полей (только типы, подобные приведенным выше), Numpy по-прежнему присваивает имена полей по умолчанию, как f0 , f1 и т. Д.

Чтобы напечатать имена полей, вы можете запустить, например, a.dtype.names. В приведенном выше случае я получил:

('f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8')

, поэтому, вероятно, ваша задача - удалить поле f7 (проверьте в своей среде). Возможно, у вас есть имена полей, явно назначенные вашим кодом, поэтому используйте вместо них предпоследнее имя.

Чтобы получить копию массива Numpy с удаленным столбцом, вы можете запустите:

import numpy.lib.recfunctions as rcf
b = rcf.drop_fields(a, 'f7')

или сохраните его обратно в a , если вы sh.

Замечание относительно решения, предложенного Джейсоном Ян :

Если вы запустите b.shape, вы получите (3, 9), тогда как ваш образец содержит (3,), а массив, который я создал, имеет именно эту форму.

Значит, ваш массив должен быть создан каким-то другим способом, чем в его решении.

0 голосов
/ 17 июня 2020

Хотя другой ответ является правильным для обычного массива, он не отвечает на вопрос в OP, который предназначен для структурированного массива . В этом случае вы можете создать новый массив только с нужными столбцами, т.е. вместо удаления ненужного столбца вы выбираете нужные столбцы.

Пример удаления седьмого столбца:

b = a[list(a.dtype.names[:7] + arr.dtype.names[8:])]

Вы также можете использовать вспомогательную функцию drop_fields:

from numpy.lib import recfunctions as rfn
b = rfn.drop_fields(a, a.dtype.names[7])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...