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 的设计哲学,又避免了底层内存管理的陷阱。

寻光
寻光

阿里达摩院寻光视频创作平台,以视觉AIGC为核心功能,用PPT制作的方式创作视频

下载
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 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

76

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接口等等。

1800

2023.10.19

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

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

572

2025.10.17

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

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

2340

2025.12.29

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

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

45

2026.01.19

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

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

51

2025.09.03

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

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

51

2025.09.03

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

4

2026.03.04

热门下载

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

精品课程

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

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