如何用Numpy构建秩数组?秩数组定义及作业示例解析
嘿,我来帮你搞定这个Numpy作业问题!先从老师给的示例入手,搞清楚什么是「秩数组」,再一步步实现函数。
第一步:理解秩数组的定义
先把老师给的示例输入输出摆出来,咱们拆解分析:
示例输入:
import numpy as np A = np.array([[9, 4, 15, 0, 18], [16, 19, 8, 10, 1]])示例输出:
[[4 2 6 0 8] [7 9 3 5 1]]
把输入数组的所有元素抽出来,按升序排列得到:[0, 1, 4, 8, 9, 10, 15, 16, 18, 19]。现在看输入里的每个元素,替换成它在这个排序数组中的索引位置(从0开始计数):
- 9在排序数组里是第4个元素(索引4)→ 输出对应位置是4
- 4是第2个元素(索引2)→ 输出对应位置是2
- 0是第0个元素→ 输出保持0
- 以此类推,完全匹配示例的输出。
所以这里的秩数组定义很明确:将原数组中的每个元素,替换为它在整个数组所有元素升序排列后的索引值,最终得到和原数组形状、尺寸完全一致的新数组。
第二步:实现
rank_calculator(A)函数 我们可以用Numpy的内置函数高效实现,避免低效循环,步骤如下:
- 将原数组展平为一维数组,方便统一处理所有元素;
- 用
np.argsort()获取展平数组排序后的索引位置; - 创建和展平数组同形状的秩数组,给排序后的位置依次赋值0、1、2…n-1;
- 将秩数组重塑回原数组的形状,返回结果。
完整代码:
import numpy as np def rank_calculator(A): # 展平原数组为一维 flat_A = A.flatten() # 获取排序后的索引(每个元素在排序后的位置) sorted_indices = np.argsort(flat_A) # 初始化秩数组 rank_array = np.zeros_like(flat_A) # 给排序后的位置分配对应的索引值 rank_array[sorted_indices] = np.arange(len(flat_A)) # 重塑为原数组形状并返回 return rank_array.reshape(A.shape)
测试验证
用示例输入跑一遍:
A = np.array([[9, 4, 15, 0, 18], [16, 19, 8, 10, 1]]) print(rank_calculator(A))
输出结果完全符合老师给的示例:
[[4 2 6 0 8] [7 9 3 5 1]]
补充:处理重复元素的情况
如果原数组中有重复元素,上面的实现会给重复元素分配不同的秩(序数秩,按元素出现顺序排序后的位置)。如果需要给重复元素分配相同的秩(稠密秩),可以用np.unique()的return_inverse参数实现:
def dense_rank_calculator(A): flat_A = A.flatten() # 获取唯一值及其逆映射(每个元素对应唯一值的索引) _, inverse = np.unique(flat_A, return_inverse=True) return inverse.reshape(A.shape)
比如输入np.array([[4,4,2]]),这个函数会返回[[1 1 0]],而之前的序数秩实现会返回[[1 2 0]]。
内容的提问来源于stack exchange,提问作者captaingb
相关产品推荐
相关产品推荐

