python - 根据范围替换numpy数组中的重复元素
问题描述
我有一个 1d numpy 数组arr
,如下所示:
arr = np.array([9, 7, 0, 4, 7, 4, 2, 2, 3, 7])
对于重复的元素,我希望随机选择包含相同元素的任何一个索引,并将其替换为0
and之间缺少的值arr.shape[0]
。
例如,在给定的数组中,索引 1、4 和 9 中存在 7。因此,我希望随机选择 1、4 和 9 之间的索引,并通过随机选择数组中不存在的某个元素(如 8)来设置其值. 最后,arr
应该包含介于 0 和(包括)arr.shape[0]
之间的唯一元素arr.shape[0] - 1
如何使用 Numpy 有效地做到这一点(可能不需要使用任何显式循环)?
解决方案
这是一个基于np.isin
-
def create_uniques(arr):
# Get unique ones and the respective counts
unq,c = np.unique(arr,return_counts=1)
# Get mask of matches from the arr against the ones that have
# respective counts > 1, i.e. the ones with duplicates
m = np.isin(arr,unq[c>1])
# Get the ones that are absent in original array and shuffle it
newvals = np.setdiff1d(np.arange(len(arr)),arr[~m])
np.random.shuffle(newvals)
# Assign the shuffled values into the duplicate places to get final o/p
arr[m] = newvals
return ar
样品运行 -
In [53]: arr = np.array([9, 7, 0, 4, 7, 4, 2, 2, 3, 7])
In [54]: create_uniques(arr)
Out[54]: array([9, 7, 0, 1, 6, 4, 8, 2, 3, 5])
In [55]: arr = np.array([9, 7, 0, 4, 7, 4, 2, 2, 3, 7])
In [56]: create_uniques(arr)
Out[56]: array([9, 4, 0, 5, 6, 2, 7, 1, 3, 8])
In [57]: arr = np.array([9, 7, 0, 4, 7, 4, 2, 2, 3, 7])
In [58]: create_uniques(arr)
Out[58]: array([9, 4, 0, 1, 7, 2, 6, 8, 3, 5])
推荐阅读
- vba - 从 VBA 进行 UTF-8 调用
- ruby-on-rails - 运行迁移会破坏测试数据库中的所有视图
- google-apps-script - 在 Google 脚本函数中读取单元格并在函数#inception 中使用它
- tfs - 将附加列添加到链接页面 (TFS 2018)
- c# - 一个用于 Raspberry Pi 3 IOT 的 C# UWP 应用程序中的多个命名空间
- java - JAVA:使用多线程将 ZipFile 复制到 ZipOutputStream
- python - ibm_boto3 在 Mac OS 上与 scikit-learn 的兼容性问题
- angular - 角度材料数据表未填充数据
- android - 生成签名 APK 时的 Android Studio 错误:插件 Android 支持中的异常
- visual-studio-code - “代码 。” 命令不起作用