Разделение одного массива NumPy на два массива
Предположим, что у меня есть массив NumPy 2D A:
>>> import numpy as np
>>> A=np.arange(30).reshape(3,10)
>>> 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, 25, 26, 27, 28, 29]])
Мне нужно получить два массива B и C со следующими свойствами:
B = array([[ 0, 3, 4, 5, 6, 7, 8, 9],
[10, 13, 14, 15, 16, 17, 18, 19],
[20, 23, 24, 25, 26, 27, 28, 29]])
C = array([[ 1, 2],
[11, 12],
[21, 22]])
Каков самый простой способ сделать это?
Обратите внимание, что мне нужно получить все наборы C (2 соседних столбца) и B (который является A без C). Я пробовал различные конструкции NumPy, такие как np.delete
, np.hstack
, но ничего не работает в угловых условиях, как в приведенном выше примере.
Ответы
Ответ 1
Один из самых простых способов - использовать индексирование для выбора соответствующих столбцов:
>>> A[:, [1, 2]] # choose all rows from columns 1-2 (gives C)
array([[ 1, 2],
[11, 12],
[21, 22]])
>>> A[:, np.r_[0, 3:10]] # choose all rows from columns 0, 3-9 (gives B)
array([[ 0, 3, 4, 5, 6, 7, 8, 9],
[10, 13, 14, 15, 16, 17, 18, 19],
[20, 23, 24, 25, 26, 27, 28, 29]])
В качестве альтернативы вы можете попробовать hsplit
разбить A
и затем объединить бит обратно вместе. Это кажется менее эффективным, чем метод индексирования выше:
>>> splits = np.hsplit(A, [1, 3])
>>> B = np.hstack((splits[0], splits[2]))
>>> C = splits[1]
Ответ 2
Вы можете использовать индексирование fancy:
B = A[:, [0] + list(range(3, A.shape[1]))]
C = A[:, [1, 2]]
где:
- запятая разделяет индексы, которые вы хотите взять из каждого измерения.
Оператор
-
:
сообщает, что принимает все элементы этого измерения
- используя последовательность целых чисел, укажет, какие элементы соответствующего измерения следует принять (например,
[1, 2]
)
Ответ 3
Для C
вы можете использовать простой срез:
>>> A[:,1:3]
array([[ 1, 2],
[11, 12],
[21, 22]])
Для B
используйте numpy.hstack
на двух срезах A
:
>>> np.hstack((A[:,:1], A[:,3:]))
array([[ 0, 3, 4, 5, 6, 7, 8, 9],
[10, 13, 14, 15, 16, 17, 18, 19],
[20, 23, 24, 25, 26, 27, 28, 29]])
>>>