如何在3D numpy数组中删除带有条件的元素行?

时间:2019-04-23 17:07:39

标签: arrays numpy

我有一个3D numpy数组,其中包含5个数据,其形状如下(5,1,1)

a=
arrray([[[0,2,4]],
[[2,6,3]],
[[1,6,9]],
[[4,3,10]]
[[3,3,8]]])

要根据数组的第二个元素来调整数组。 How to count frequency of a element in numpy array?由此计算出第二个元素的出现。 2变成单身。6和3重复两次。在这里,我想删除出现次数小于2的数组元素。 如果需要删除第一行[0,2,4]。

1 个答案:

答案 0 :(得分:1)

这可以使用bincount完成:

In [11]: bins = np.bincount(a[:, 0, 1])

In [22]: a[bins[a[:, 0, 1]] > 1]
Out[22]:
array([[[ 2,  6,  3]],

       [[ 1,  6,  9]],

       [[ 4,  3, 10]],

       [[ 3,  3,  8]]])

一个人也可以用熊猫来做到这一点:

In [21]: pd.DataFrame(a[:, 0, :]).groupby(1)[0].transform('size')
Out[11]:
0    1
1    2
2    2
3    2
4    2
Name: 0, dtype: int64

In [22]: pd.DataFrame(a[:, 0, :]).groupby(1)[0].transform('size') > 1
Out[22]:
0    False
1     True
2     True
3     True
4     True
Name: 0, dtype: bool

In [23]: a[pd.DataFrame(a[:, 0, :]).groupby(1)[0].transform('size') > 1]
Out[23]:
array([[[ 2,  6,  3]],

       [[ 1,  6,  9]],

       [[ 4,  3, 10]],

       [[ 3,  3,  8]]])

请注意,如果整数的最大大小非常大,则np.bincount会效率低下。可能还有一种将np.unique与return_counts结合使用的方法:

In [31]: nums, counts = np.unique(a[:, 0, 1], return_counts=True)

In [32]: a[counts[np.searchsorted(nums, a[:, 0, 1])] > 1]
Out[32]:
array([[[ 2,  6,  3]],

       [[ 1,  6,  9]],

       [[ 4,  3, 10]],

       [[ 3,  3,  8]]])