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

如何用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的内置函数高效实现,避免低效循环,步骤如下:

  1. 将原数组展平为一维数组,方便统一处理所有元素;
  2. 用np.argsort()获取展平数组排序后的索引位置;
  3. 创建和展平数组同形状的秩数组,给排序后的位置依次赋值0、1、2…n-1;
  4. 将秩数组重塑回原数组的形状,返回结果。

完整代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:28:45