当前位置: 首页 > news >正文

`np.array` 和 `np.ndarray`是什么关系?

np.arraynp.ndarray 是 NumPy 中两个密切相关但用途和行为完全不同的概念。理解它们的关系是掌握 NumPy 的关键之一。


🔹 1. np.ndarray:NumPy 数组的底层类(类型)

  • numpy.ndarray所有 NumPy 数组对象的实际 Python 类型
  • 它是一个类(class),定义了数组的数据结构、属性(如 .shape, .dtype)和方法(如 .sum(), .reshape())。
  • 所有通过 NumPy 创建的数组,其类型都是 numpy.ndarray
import numpy as npa = np.array([1, 2, 3])
print(type(a))          # <class 'numpy.ndarray'>
print(isinstance(a, np.ndarray))  # True

✅ 所有 NumPy 数组都是 np.ndarray 的实例。


🔹 2. np.array:创建 ndarray 对象的函数

  • np.array() 是一个工厂函数(function),用于从 Python 列表、元组或其他可迭代对象创建一个新的 ndarray 实例
  • 它会自动推断数据类型,并初始化数据内容
arr = np.array([1, 2, 3])        # 推荐方式!
print(arr)                       # [1 2 3]
print(type(arr))                 # <class 'numpy.ndarray'>

np.array() 是你日常创建数组的主要方式


🔸 关键区别总结

特性 np.array np.ndarray
类型 函数(callable) (class)
用途 创建并初始化数组 定义数组的类型和行为
数据初始化 ✅ 自动用输入数据初始化 不初始化(可能含垃圾值)
使用频率 ⭐⭐⭐⭐⭐ 日常首选 ⭐ 很少直接使用
安全性 安全、可靠 危险(未初始化内存)

🔸 为什么不推荐直接用 np.ndarray(...)

虽然你可以直接调用 np.ndarray 构造函数,但它不会用你的数据初始化数组内容,而是分配一块内存(可能包含任意垃圾值),除非你显式传入 buffer

示例对比:

# ✅ 正确方式:使用 np.array
a = np.array([1, 2, 3])
print(a)  # [1 2 3]# ⚠️ 危险方式:直接调用 np.ndarray
b = np.ndarray(shape=(3,), dtype=int)
print(b)  # 可能输出 [123456789 0 -987654321] —— 垃圾值!# 如果非要初始化,需手动赋值或用 buffer(复杂且不直观)
c = np.ndarray(shape=(3,), dtype=int, buffer=np.array([1,2,3]))
print(c)  # [1 2 3] —— 但何必这么麻烦?

📌 官方文档明确建议:优先使用 np.array()np.zeros()np.ones() 等函数创建数组,不要直接实例化 np.ndarray


🔸 类比理解(帮助记忆)

可以把它们类比为:

  • np.ndarray“汽车的设计图纸/类”
  • np.array()“汽车制造厂的生产线函数”

你想开一辆车,应该去生产线下单(np.array([1,2,3])),而不是自己拿着图纸去拼装底盘(np.ndarray(...))——后者既麻烦又容易出错。


✅ 最佳实践

  • 总是使用 np.array() 来从已有数据创建数组。
  • 使用 np.zeros(), np.ones(), np.empty(), np.full() 等来创建特定初始值的数组。
  • 不要直接调用 np.ndarray(),除非你在写非常底层的代码(比如自定义数组子类),且知道自己在做什么。

🔚 总结一句话:

np.array 是创建 ndarray 对象的推荐函数;np.ndarray 是所有 NumPy 数组的底层类类型。日常编程中,你几乎只用 np.array,而不需要直接碰 np.ndarray

http://www.jsqmd.com/news/47903/

相关文章:

  • 大数据部门和AI部门边界
  • Post Processing
  • 工作草稿
  • 【Rust编程:从新手到大师】Rust 环境搭建(详细版) - 教程
  • 2025年11月南通宠物医疗市场深度分析:专业服务与行业规范的标杆选择
  • 软工团队作业3
  • 电梯调度迭代编程作业复盘
  • 球坐标系的大运动方程组
  • 【数据库】navicat的下载以及数据库约束 - 实践
  • i2c linux
  • hyper-v linux
  • 二维费用背包 尽量前后一直把好像也没关系
  • 详细介绍:在Windows中的Docker与WSL2的关系,以及与WSL2中安装的Ubuntu等其它实例的关系
  • ThinkPHP5 RCE+Linux find提权渗透实战:原理+复现(CVE-2018-20062) - 详解
  • 团队作业3--需求改进与系统设计
  • 单部电梯调度总结
  • hyper for linux
  • https linux
  • 页面
  • Trick——数据结构
  • 锂矿及其投资机会
  • 电梯调度迭代编程作业复盘:从问题剖析到能力进阶
  • MORL | Envelope Q-Learning:有收敛性保证的 MORL 算法
  • 获深圳人才集团认可!「张张讲AI」AI资讯公众号解读AI动态,讲师提供定制化咨询
  • 多重背包 二进制拆分这个向左移动以为是2也是被我写出来了
  • why exams are bad
  • 若依框架源码—2
  • http linux
  • html空间能用于表单吗
  • html空间能用于布局吗