You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二维NumPy数组元素替换为出现次数的实现方案问询

解决NumPy数组元素替换为全局出现次数的问题

你的思路完全正确——先统计每个元素的全局出现次数,再把原数组里的每个元素替换成对应的计数,这是最直接也最容易理解的方案。我来给你具体拆解实现步骤,还有两种不同效率的写法供你选择:

步骤1:统计元素的全局出现次数

我们可以用NumPy自带的np.unique()函数,它能一次性返回去重后的元素和每个元素的出现次数,正好用来生成我们需要的映射字典:

import numpy as np

# 定义原数组
original_arr = np.array([[2,2,3,3], [2,3,3,3], [3,3,4,4]])

# 获取唯一元素列表和对应的出现次数数组
unique_elements, element_counts = np.unique(original_arr, return_counts=True)

# 把两个数组打包成字典,键是元素,值是出现次数
count_mapping = dict(zip(unique_elements, element_counts))

执行完这段代码后,count_mapping就是{2:3, 3:7, 4:2},完全符合你的需求。

步骤2:将原数组元素替换为对应次数

这里有两种写法,分别适合不同场景:

方法1:简洁直观的向量化函数(适合小到中等规模数组)

用np.vectorize()把字典的查找逻辑转换成能处理整个数组的向量化函数:

# 创建向量化的映射函数
map_to_count = np.vectorize(lambda x: count_mapping[x])

# 生成结果数组
result_arr = map_to_count(original_arr)

方法2:高效的索引映射(适合大规模数组)

np.unique()返回的unique_elements是排序后的数组,所以我们可以用np.searchsorted()快速找到每个元素在排序数组中的位置,再用这个位置去索引element_counts数组,这种写法完全是NumPy的底层向量化操作,比vectorize快得多:

# 找到原数组每个元素在unique_elements中的索引位置
element_indices = np.searchsorted(unique_elements, original_arr)

# 用索引获取对应的出现次数
result_arr = element_counts[element_indices]

验证结果

不管用哪种方法,执行后打印result_arr都会得到你想要的结果:

print(result_arr)
# 输出:
# [[3 3 7 7]
#  [3 7 7 7]
#  [7 7 2 2]]

额外小贴士

  • 这个方案支持所有类型的NumPy数组元素(比如负数、浮点数),只要元素是可哈希的就行。
  • 如果你的数组非常大(比如百万级以上元素),一定要选第二种索引映射的方法,避免vectorize带来的隐性循环开销。

内容的提问来源于stack exchange,提问作者Tschoko Kuki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:47:10