提取numpy数组中的特定列


163

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

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

似乎上述行就足够了,但我想不是。我环顾四周,但找不到关于此特定场景的任何语法明智的方法。

Answers:


271

我假设你想要的列19?那是

data[:, [1, 9]]

或带有名称:

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

您可以从data.dtype.names… 获得名字。


如何使用列名呢?
Zelphir Kaltstahl '16

9
data [:, ['Column Name1','Column Name2']]
代码刺客

是视图还是副本?我的瓶颈在这条线上,我正在寻找优化方法
Fractale

1
可能是此功能不再起作用了吗?
PV8

这个语法叫什么?
墨西哥卷饼


14

如果只想提取一些列:

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]

9

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

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


2
您也可以使用冒号来实现此目的,例如data[:, 8:9]。这将占用八列,但不会删除多余的尺寸。
Jan Kukacka

数据[:8]也将挑选8列,并返回一个矩阵的Mx1
StefanMK

5

只是:

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

2

使用类似这样的列表从ND数组中选择列时,您还应该注意一件事:

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

1

您可以使用 :

extracted_data = data.ix[:,['Column1','Column2']]


2
一个好的答案总是可以解释这样做的原因以及为什么这样做,不仅对于OP,而且对于将来的SO访问者。请添加一些描述,以使其他人理解。
Rucha Bhatt Joshi


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.