过滤嵌套的numpy数组

czq61nw1  于 2023-03-23  发布在  其他
关注(0)|答案(2)|浏览(112)

你好,我正在尝试过滤下面的numpy数组,但遇到了问题。我想过滤所有等于[('a','b ','c'),1]。问题是我不知道如何合并每个数组中的元素,所以不是[('a ','b','c '),1],我会有[('a','b ','c',1)],或者简单地过滤给定的原始结构。我尝试了np.concatenate()和np.ravel()的组合,但结果不是预期的。

a = np.array([[('a','b','c'), 1], [('b','c','a'), 1], [('a','b','c'), 2], [('a','b','c'), 1]])

Method:
Filter if 1st element = 'a', 2nd element = 'b', 3rd element ='c' and 4th element = 1

Desired Output:
output = np.array([[('a','b','c'), 1], [('a','b','c'), 1]])

编辑:我能够让这个与pandas解决方案一起工作,但只能通过将其转换为dataframe,这太昂贵了,因此我试图用numpy实现更优化的解决方案

pgccezyw

pgccezyw1#

您可以:

a[(a == [('a', 'b', 'c'), 1]).all(1)]

输出:

array([[('a', 'b', 'c'), 1],
       [('a', 'b', 'c'), 1]], dtype=object)

a == [('a', 'b', 'c'), 1]的输出:

array([[ True,  True],
       [False,  True],
       [ True, False],
       [ True,  True]])

不同元素对应不同比较器:

注意:你在评论中说了第四个元素,但它并不是真正的第四个元素,它是你构造numpy数组的第二个元素。
现在,如果你想为第二个元素(整数)设置一个〈=的条件,为元组元素(比如('a ',' b ',' c '))设置==的条件,简而言之,由于数组的构造方式,没有简单的方法。
但是一个解决方法是创建一个辅助数组,如:

abc = np.array([[('a','b','c'), 0]], dtype='O').repeat(len(a), axis=0)

然后用它来过滤不同的比较器为不同的列,如:

a[(a[:, 0] == abc[:, 0]) & (a[:, 1] <= 2)]
ybzsozfc

ybzsozfc2#

在您的情况下,更快的方法是显式比较第1项和第2项:

[r for r in a if r[0] == ('a','b','c') and r[1] == 1]
In [400]: %timeit [r for r in a if r[0] == ('a','b','c') and r[1] == 1]
1.2 µs ± 6.69 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [402]: %timeit a[(a == [('a', 'b', 'c'), 1]).all(1)]
7.21 µs ± 85.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

相关问题