将一个NumPy数组拆分成两个数组

14

假设我有一个 NumPy 的二维数组 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]])

我需要获取两个数组 BC,这两个数组需要具备以下特性:

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(即没有CA)的集合。我尝试了不同的NumPy构造,例如np.deletenp.hstack,但在上面的示例中似乎都无法处理边缘条件。

3个回答

14

最简单的方法之一是使用索引来选择适当的列:

>>> 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]])

或者,您可以尝试使用hsplitA分割并将位拼回在一起。尽管如此,这种方法比上面的索引方法效率要低:

>>> splits = np.hsplit(A, [1, 3]) 
>>> B = np.hstack((splits[0], splits[2]))
>>> C = splits[1]

4
您可以使用数组高级索引:
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,在两个A的切片上使用numpy.hstack

>>> 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]])
>>> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接