从numpy数组中提取特定列

232

这是一个简单的问题,但假设我有一个MxN矩阵。我想要做的就是提取特定的列并将它们存储在另一个numpy数组中,但我得到了无效的语法错误。
以下是代码:

extractedData = data[[:,1],[:,9]]. 

看起来上面的行应该就足够了,但我猜不是这样。我找了一圈,但在语法上没有找到关于这种特定情况的任何信息。

11个回答

384

我假设您想要选择第1列和第9列?

要同时选择多个列,请使用

X = data[:, [1, 9]]

要逐个选择,请使用

x, y = data[:, 1], data[:, 9]

带有名称:

data[:, ['Column Name1','Column Name2']]

你可以从 data.dtype.names 获取名称...


如何使用列名来实现这个? - Zelphir Kaltstahl
9
这段代码意思是选取名为"Column Name1"和"Column Name2"的两列数据,对应的代码是:data[:, ['Column Name1','Column Name2']]。 - code-assassin
1
它是一个视图还是一份拷贝?我的瓶颈在这一行,我正在寻找优化的方法。 - Fractale
2
这个函数不再起作用了吗? - PV8
如果您想从 ab 提取所有列,请尝试 X = data[:, range(a, b + 1)] - Daniel
显示剩余2条评论

38

假设您想要使用该代码片段获取第1列和第9列,那么应该这样写:

extractedData = data[:,[1,9]]

18

如果您只想提取其中的一些列:

idx_IN_columns = [1, 9]
extractedData = data[:,idx_IN_columns]

如果您想排除特定的列:

idx_OUT_columns = [1, 9]
idx_IN_columns = [i for i in xrange(np.shape(data)[1]) if i not in idx_OUT_columns]
extractedData = data[:,idx_IN_columns]

13

只是:

>>> m = np.matrix(np.random.random((5, 5)))
>>> m
matrix([[0.91074101, 0.65999332, 0.69774588, 0.007355  , 0.33025395],
        [0.11078742, 0.67463754, 0.43158254, 0.95367876, 0.85926405],
        [0.98665185, 0.86431513, 0.12153138, 0.73006437, 0.13404811],
        [0.24602225, 0.66139215, 0.08400288, 0.56769924, 0.47974697],
        [0.25345299, 0.76385882, 0.11002419, 0.2509888 , 0.06312359]])
>>> m[:,[1, 2]]
matrix([[0.65999332, 0.69774588],
        [0.67463754, 0.43158254],
        [0.86431513, 0.12153138],
        [0.66139215, 0.08400288],
        [0.76385882, 0.11002419]])

列的顺序不需要按顺序:

>>> m[:,[2, 1, 3]]
matrix([[0.69774588, 0.65999332, 0.007355  ],
        [0.43158254, 0.67463754, 0.95367876],
        [0.12153138, 0.86431513, 0.73006437],
        [0.08400288, 0.66139215, 0.56769924],
        [0.11002419, 0.76385882, 0.2509888 ]])

11

我想指出的一件事是,如果您要提取的列数为1,则结果矩阵不会是您期望的Mx1矩阵,而是一个包含所提取列元素的数组。

要将其转换为矩阵,应在结果数组上使用reshape(M,1)方法。


2
你也可以使用冒号来实现这个,例如 data [:,8:9]。这将获取第八列,但不会删除额外的维度。 - Jan Kukacka
2
data[:,8] 也会选择第8列并返回一个Mx1矩阵。 - StefanMK

3

当使用类似这样的列表从N-D数组中选择列时,您还需要注意一件事:

data[:,:,[1,9]]

如果您删除一个维度(例如只选择一行),结果数组将被(由于某种原因)重新排列。因此:
print data.shape            # gives [10,20,30]
selection = data[1,:,[1,9]]
print selection.shape       # gives [2,20] instead of [20,2]!!

3
您可以使用以下内容:
extracted_data = data.ix[:,['Column1','Column2']]

4
一个好的答案应该解释清楚所做的事情以及为什么要以这种方式进行,这不仅适用于提问者,也适用于未来访问Stack Overflow的其他人。请添加一些描述,以便让其他人理解。 - Rucha Bhatt Joshi

1
这里是另一个示例,对于需要从数据中获取特定列和范围的情况可能很有用。在数以百万计的行上运行需要几秒钟,您可以通过添加额外的列表(例如,columns = ... + [1] + [5]等)来添加更多列:
columns = [0] + [x for x in range(4,62-3)]
print(columns)
selected_data = train_data[:,columns]

0

我无法编辑所选答案,因此我添加了一个答案以澄清使用整数索引似乎返回视图(而不是副本),而使用列表则返回副本。

>>> x = np.zeros(shape=[2, 3])
>>> y = x[:, [0, 1]]
>>> z1, z2 = x[:, 0], x[:, 1]

>>> y[0, 0] = 1
>>> print(y)
[[1. 0.]
 [0. 0.]]
>>> print(x)
[[0. 0. 0.]
 [0. 0. 0.]]

>>> z1[0] = 2
>>> print(z1)
[2. 0.]
>>> print(x)
[[2. 0. 0.]
 [0. 0. 0.]]

0

问题是关于numpy数组而不是数据框架的。 - TMrtSmith

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