如何从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中的数组(或矩阵)中提取除一列之外的所有列?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 python 中的图像(或 pdf 文件)中提取名称和手写数字?