0

0

如何创建支持原地修改的 NumPy ndarray 子类

霞舞

霞舞

发布时间:2026-03-04 20:36:12

|

909人浏览过

|

来源于php中文网

原创

如何创建支持原地修改的 NumPy ndarray 子类

本文介绍如何正确继承 np.ndarray 并实现可变行为(如 shift_up、truncate),解决直接调用 self.__init__() 失效的问题,强调 __new__ 的必要性、视图与副本的区别,以及安全、可维护的子类设计实践。

本文介绍如何正确继承 np.ndarray 并实现可变行为(如 shift_up、truncate),解决直接调用 self.__init__() 失效的问题,强调 __new__ 的必要性、视图与副本的区别,以及安全、可维护的子类设计实践。

在 NumPy 中,ndarray 是一个“不可变构造”的类——其核心数据缓冲区在对象创建后即固定,__init__ 仅用于初始化辅助属性,不负责分配或替换底层数组内存。因此,像 self.__init__(arr) 这样的写法不会改变实例的数据,反而可能引发未定义行为或静默失败。要实现真正支持“自身修改”的 ndarray 子类,必须遵循 NumPy 的子类协议:重载 __new__ 而非依赖 __init__,并通过 view() 或 asarray() 构造新视图/副本,并合理返回。

✅ 正确做法:基于 __new__ 的可变接口设计

推荐采用“函数式 + 显式赋值”风格:方法返回新的 Test 实例(而非尝试就地修改),使用者通过赋值更新引用。这既符合 NumPy 的设计哲学,又避免了底层内存管理的陷阱。

Leewow
Leewow

全球首个AI造物智能体

下载
import numpy as np

class Test(np.ndarray):
    def __new__(cls, input_array):
        # 将输入转换为 ndarray,并以 Test 类型返回视图
        obj = np.asarray(input_array).view(cls)
        return obj

    def shift_up(self):
        """向上平移:首元素置 NaN,其余元素前移一位"""
        if len(self) == 0:
            return self.copy()
        result = self.copy()
        result[1:] = self[:-1]  # 向量化赋值,高效且安全
        result[0] = np.nan
        return result.view(Test)  # 保持类型为 Test

    def truncate(self, index):
        """截断至索引 index(不含),返回新 Test 实例"""
        if index < 0:
            raise ValueError("index must be non-negative")
        index = min(index, len(self))  # 防越界
        return self[:index].view(Test)

    def __array_finalize__(self, obj):
        # 确保视图操作(如切片)后仍为 Test 类型
        if obj is None: return

? 使用示例与验证

# 创建实例
arr = Test([1, 2, 3, 4, 5])
print("Original:", arr)  # [1 2 3 4 5]

# 截断(返回新实例,需重新赋值)
arr = arr.truncate(3)
print("After truncate(3):", arr)  # [1 2 3]

# 平移(同样返回新实例)
arr = arr.shift_up()
print("After shift_up():", arr)  # [nan  1.  2.]

⚠️ 关键注意事项

  • 永远不要在 __init__ 中尝试重建数组:np.ndarray 的 __init__ 不处理数据分配;__new__ 才是构造入口。
  • 避免 self.__npArr__ 封装字段:绕过 ndarray 底层会丧失向量化、广播、内存连续性等核心优势,且破坏 view() 行为。
  • 优先使用向量化操作:如 result[1:] = self[:-1] 比 Python 循环快数十倍,也更安全。
  • 显式 .view(Test) 确保类型延续:切片或运算后默认返回 np.ndarray,需显式转回子类类型。
  • 边界检查不可省略:truncate 中的 min(index, len(self)) 防止空数组或越界访问。

? 总结

构建可读性强、行为可控的 ndarray 子类,关键在于尊重 NumPy 的对象模型:用 __new__ 控制构造,用 view() 和向量化操作实现逻辑,用清晰的返回语义(而非“伪就地修改”)表达意图。这种方式不仅稳定可靠,还能无缝兼容 NumPy 生态(如 matplotlib、pandas 输入),是工程实践中最推荐的路径。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

78

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

12

2026.01.31

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1825

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

594

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2343

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.19

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

51

2025.09.03

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

51

2025.09.03

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

4

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号