首页 > 解决方案 > 如何在 3D numpy 数组中删除有条件的元素行?

问题描述

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

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

根据数组的第二个元素,调整数组。如何计算numpy数组中元素的频率?以此计算第二个元素的出现。2 来单。6 和 3 重复两次。这里我想删除出现次数小于2的数组元素。如果需要删除第一行[0,2,4]。

标签: arraysnumpy

解决方案


这可以使用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]]])

也可以使用 pandas 来做到这一点:

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

推荐阅读