如何在numpy数组中删除一列?

20

假设我们有一个5x4的矩阵。 我们只需要移除第一维。 如何使用numpy实现?

array([[  0.,   1.,   2.,   3.],
       [  4.,   5.,   6.,   7.],
       [  8.,   9.,  10.,  11.],
       [ 12.,  13.,  14.,  15.],
       [ 16.,  17.,  18.,  19.]], dtype=float32)

我试过:

arr = np.arange(20, dtype=np.float32)
matrix = arr.reshape(5, 4)
new_arr = numpy.delete(matrix, matrix[:,0])
trimmed_matrix = new_arr.reshape(5, 3)

它看起来有点笨重。 如果是的话,是否有一种更干净的方法可以在不改变形状的情况下删除维度?


你想得到一个(5,3)的数组?那么你想要删除一列(或者一般地,从一个维度中删除一个'entry')。删除一个维度会导致转换成一个(5,)(4,)数组。 - DilithiumMatrix
3
似乎你想要从一个二维数组中移除第一列。可以这样做:arr[:,1:] - Christian K.
1
np.delete 通过索引而非值进行操作。它不是 listremove 方法。 - hpaulj
3个回答

55

如果您想从2D Numpy数组中删除列,可以像这样指定列

保留所有行并且除去第0列(或从第一列开始到最后)。

a[:,1:]

另一种指定要保留的列并可以改变其顺序的方法是:

保留所有行并只使用第0、2、3列。

a[:,[0,2,3]]

可以在这里找到有关此文档的信息:here

如果您想要特定地删除列,可以执行以下操作:

idxs = list.range(4)
idxs.pop(2) #this removes elements from the list
a[:, idxs]

而@hpaulj提出了numpy.delete()

这将返回沿轴axis=1删除2列(0和2)的“a”的视图。

np.delete(a,[0,2],1)

这并没有真正地从“a”中删除这些项目,它的返回值是一个新的NumPy数组。


1
只有 [:,1:] 返回一个 view(即使用相同的数据缓冲区)。其他的则会复制。 - hpaulj

9
正确使用delete的方法是指定索引和维度,例如:删除第一列(维度1)(即0列):
In [215]: np.delete(np.arange(20).reshape(5,4),0,1)
Out[215]: 
array([[ 1,  2,  3],
       [ 5,  6,  7],
       [ 9, 10, 11],
       [13, 14, 15],
       [17, 18, 19]])

其他可以使用的表达方式:

np.arange(20).reshape(5,4)[:,1:]
np.arange(20).reshape(5,4)[:,[1,2,3]]
np.arange(20).reshape(5,4)[:,np.array([False,True,True,True])]

4

你不需要第二次reshape。

matrix=np.delete(matrix,0,1)

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