我有一个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]。
答案 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]]])