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

2024-10-02 14:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个NumPy2D数组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(两个相邻列)和B(即A,没有C)。我尝试了不同的NumPy构造,比如np.deletenp.hstack,但是在上面的示例中,似乎没有任何东西在角落条件下工作。


Tags: 方法importnumpy示例属性asnp数组
3条回答

对于C,可以使用简单的切片:

>>> A[:,1:3]
array([[ 1,  2],
       [11, 12],
       [21, 22]])

对于B,在两片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]])
>>> 

可以使用数组花式索引:

B = A[:, [0] + list(range(3, A.shape[1]))]
C = A[:, [1, 2]]

其中:

  • 逗号分隔要从每个维度获取的索引。
  • 运算符:告诉获取该维度的所有元素
  • 使用整数序列将指定应采用相应维度的哪些元素(例如[1, 2]

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

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

相关问题 更多 >