如何从python中的数组(或矩阵)中提取除一列之外的所有列?

Posted

技术标签:

【中文标题】如何从python中的数组(或矩阵)中提取除一列之外的所有列?【英文标题】:How to extract all columns but one from an array (or matrix) in python? 【发布时间】:2014-07-24 11:45:12 【问题描述】:

给定一个 numpy 二维数组(或矩阵),我想提取除第 i 个以外的所有列。

E. G。来自

1 2 3 4
2 4 6 8
3 6 9 12

我想要,例如

1 2 3
2 4 6
3 6 9

1 2 4
2 4 8
3 6 12

我找不到 pythonic 方法来做到这一点。我现在你可以简单地提取给定的列

a[:,n]

a[:,[n,n+1,n+5]]

但是除了一个之外,将它们全部提取出来呢?

【问题讨论】:

Python: slicing a multi-dimensional array 的可能重复项 感谢 MainMa,但我问的问题与您所指的问题不同。 【参考方案1】:

给出的答案已经可以很容易地适应选择除列表之外的所有列,但这里有几个明确的例子:

In [1]: import numpy as np
In [2]: a = np.arange(12).reshape(3, 4)
In [3]: a
Out[3]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [4]: drop_cols = [0, 3]

# option 1: delete the columns you don't want (like @Jaime)
# (this is really the most straightforward)

In [5]: np.delete(a, drop_cols, axis=1)
Out[5]:
array([[ 1,  2],
       [ 5,  6],
       [ 9, 10]])

# option 2: pass the indices of columns to keep (like @chrisb)

In [6]: a[:, [i for i in range(a.shape[1]) if i not in drop_cols]]
Out[6]:
array([[ 1,  2],
       [ 5,  6],
       [ 9, 10]])

# option 3: use an array of T/F for each col (like @Peter Gibson)

In [7]: a[:, [i not in drop_cols for i in range(a.shape[1])]]
Out[7]:
array([[ 1,  2],
       [ 5,  6],
       [ 9, 10]])

【讨论】:

【参考方案2】:

由于一般情况下您无论如何都会返回一个副本,您可能会发现自己使用np.delete 生成了更具可读性的代码:

>>> a = np.arange(12).reshape(3, 4)
>>> np.delete(a, 2, axis=1)
array([[ 0,  1,  3],
       [ 4,  5,  7],
       [ 8,  9, 11]])

【讨论】:

这太完美了!一行,适用于数组和矩阵,非常清楚!谢谢 想提一下,这不会改变a 矩阵。这是我所期待的。【参考方案3】:

使用不包括最后一个元素的切片。

In [19]: a[:,:-1]
Out[19]: 
array([[1, 2, 3],
       [2, 4, 6],
       [3, 6, 9]])

如果您想要除最后一个元素之外的其他内容,我只需构建一个列表以供选择。

In [20]: selector = [x for x in range(a.shape[1]) if x != 2]
In [21]: a[:, selector]
Out[21]: 
array([[ 1,  2,  4],
       [ 2,  4,  8],
       [ 3,  6, 12]])

http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

【讨论】:

很好,请注意,此方法使用高级整数切片(通过索引选择列),而我发布的解决方案使用高级布尔切片(选择带有布尔掩码的列)。两者都很好。 我试图通过使用选择器 range(a.shape[1]).remove(2) 使其更简单,但这似乎不起作用。你知道为什么吗? @FerdinandoRandisi .remove 不会返回它修改它的数组,所以range(a.shape[1]).remove(2) 的结果是None。你可以使用selector = range(a.shape[1]); selector.remove(2)【参考方案4】:

看看numpy的advanced slicing

>>> import numpy as np
>>> a = np.array([[1,2,3,4], [2,4,6,8], [3,6,9,12]])
>>> a[:,np.array([True, True, False, True])]
array([[ 1,  2,  4],
       [ 2,  4,  8],
       [ 3,  6, 12]])

【讨论】:

以上是关于如何从python中的数组(或矩阵)中提取除一列之外的所有列?的主要内容,如果未能解决你的问题,请参考以下文章

matlab如何提取矩阵中的每一列作为新的变量

php中如何把原数组中的一列取出来组成新数组

如何从 python 中的图像(或 pdf 文件)中提取名称和手写数字?

如何使用 MySQL 查询从表中选择除一列之外的所有内容? [复制]

如何选择表格中除一列以外的所有列?

如何取矩阵的某一行,或某一列