python二维数组筛选,Python numpy按条件过滤二维数组

Python newbie here, I have read Filter rows of a numpy array? and the doc but still can't figure out how to code it the python way.

Example array I have: (the real data is 50000 x 10)

a = numpy.asarray([[2,'a'],[3,'b'],[4,'c'],[5,'d']])

filter = ['a','c']

I need to find all rows in a with a[:, 1] in filter. Expected result:

[[2,'a'],[4,'c']]

My current code is this:

numpy.asarray([x for x in a if x[1] in filter ])

It works okay but I have read somewhere that it is not efficient. What is the proper numpy method for this?

Edit:

Thanks for all the correct answers! Unfortunately I can only mark one as accepted answer. I am surprised that numpy.in1d is not turned up in google searchs for numpy filter 2d array.

解决方案

You can use a bool index array that you can produce using np.in1d.

You can index a np.ndarray along any axis you want using for example an array of bools indicating whether an element should be included. Since you want to index along axis=0, meaning you want to choose from the outest index, you need to have 1D np.array whose length is the number of rows. Each of its elements will indicate whether the row should be included.

A fast way to get this is to use np.in1d on the second column of a. You get all elements of that column by a[:, 1]. Now you have a 1D np.array whose elements should be checked against your filter. Thats what np.in1d is for.

So the complete code would look like:

import numpy as np

a = np.asarray([[2,'a'],[3,'b'],[4,'c'],[5,'d']])

filter = np.asarray(['a','c'])

a[np.in1d(a[:, 1], filter)]

or in a longer form:

import numpy as np

a = np.asarray([[2,'a'],[3,'b'],[4,'c'],[5,'d']])

filter = np.asarray(['a','c'])

mask = np.in1d(a[:, 1], filter)

a[mask]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值