arrays - 如何在 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]。
解决方案
这可以使用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]]])
推荐阅读
- php - Laravel 中的配置助手
- asp.net - 连接下拉列表中的两个字段
- python - Adam 优化器 - ValueError:tf.function-decorated 函数试图在非第一次调用时创建变量
- node.js - Node JS请求获取原始url
- simulink - 如何将结构用作 simulink 子系统的参数并将内部的字段用作模块参数?
- c++ - 创建一个模板函数,根据模板参数类型条件返回不同的元组类型
- javascript - Vue 中的 STLLoader 无法正常工作
- python - ValueError:使用 sklearn 的 train_test_split 时
- c# - 如何使用 C#“查询”Active Directory
- r - 将数据作为数据框读入,将某些分类变量作为因子,并对某些数值变量进行转换