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

如何用Python内置slice函数实现二维数组行/列切片?

实现基于指令的二维数组行列切片函数

一、未知数组形状下的行列索引技巧

无需提前计算数组形状,直接用负数索引就能快速定位最后一行/列,完全适配未知形状的数组:

  • 最后一行:arr[-1, :]
  • 最后一列:arr[:, -1]
  • 第一行:arr[0, :]
  • 第一列:arr[:, 0]
    这里的:可以用Python内置的slice(None)替代,两者是完全等价的,slice(None)就是创建一个代表"全选"的切片对象。

二、编写getSlice函数

函数接收目标数组和切片指令两个参数,内部将指令映射为对应的索引组合,返回切片结果:

import numpy as np

def getSlice(arr, instruction):
    # 指令到索引组合的映射表
    instr_map = {
        'first row': (0, slice(None)),
        'last row': (-1, slice(None)),
        'first column': (slice(None), 0),
        'last column': (slice(None), -1)
    }
    
    if instruction not in instr_map:
        raise ValueError(f"不支持的指令:{instruction}")
    
    return arr[instr_map[instruction]]

测试示例

# 3x3测试数组
a = np.arange(1, 10).reshape(3,3)
print(getSlice(a, 'first row'))      # 输出 [1 2 3]
print(getSlice(a, 'last column'))    # 输出 [3 6 9]

# 转置数组后测试
a_transposed = a.T
print(getSlice(a_transposed, 'first row'))  # 输出 [1 4 7](原数组第一列)

三、适配预先配置的使用场景

如果需要预先配置关注的行列(比如用字典存储),直接将配置的指令传入函数即可,不管数组后续是否转置、修改形状,函数都会基于当前数组的结构返回对应的行列:

# 预先配置关注项
config = {'a1': 'first row', 'a2': 'last column'}

# 原始数组的切片结果
a = np.arange(1, 10).reshape(3,3)
result_a1 = getSlice(a, config['a1'])
result_a2 = getSlice(a, config['a2'])

# 数组转置后的切片结果
a_trans = a.T
result_a1_trans = getSlice(a_trans, config['a1'])  # 转置后的第一行
result_a2_trans = getSlice(a_trans, config['a2'])  # 转置后的最后一列

扩展:支持更多自定义切片指令

如果需要支持指定第N行/列的需求,可以扩展函数逻辑,让指令接受元组格式(比如('row', 2)代表第三行):

def getSlice(arr, instruction):
    # 处理元组格式的自定义指令
    if isinstance(instruction, tuple):
        dim, idx = instruction
        if dim == 'row':
            return arr[idx, slice(None)]
        elif dim == 'column':
            return arr[slice(None), idx]
        else:
            raise ValueError("维度类型只能是'row'或'column'")
    
    # 保留原有字符串指令支持
    instr_map = {
        'first row': (0, slice(None)),
        'last row': (-1, slice(None)),
        'first column': (slice(None), 0),
        'last column': (slice(None), -1)
    }
    
    if instruction in instr_map:
        return arr[instr_map[instruction]]
    
    raise ValueError(f"不支持的指令:{instruction}")

# 测试扩展指令
print(getSlice(a, ('row', 1)))         # 输出 [4 5 6](第二行)
print(getSlice(a, ('column', -2)))     # 输出 [2 5 8](倒数第二列)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:25:24