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

为什么numpy ndarray对象没有__dict__属性?

Numpy数组为何没有__dict__属性?

先看实际操作中的问题:

>>> import numpy as np
>>> a = np.arange(12)
>>> a.reshape(3,4)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> type(a)
<class 'numpy.ndarray'>
>>> a.__dict__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute __dict__. Did you mean: '__dir__'?
>>> '__dict__' in dir(a)
False

根据文档,obj.__dict__用于存储对象的可写属性。我们可以用dir(a)和getattr()获取数组的键值对属性,而且shape、itemsize等属性都能从数组构造参数推导出来,strides也可通过如下代码计算:

def calStrides(self, shape, itemSize):
    loops = len(shape)
    print(f"calculating strides... loop times = {loops}")
    lst = []
    for i in range(loops):
        y = 1   #   first multiplicand
        for j in range(i + 1, loops):
            y *= shape[j]
        lst.append(y * itemSize)
    self.cal_strides = tuple(lst)

疑问与解答:

这些属性是不是只读的?

是的。shape、strides、itemsize这类属性大多是只读的——你可以直接读取,但不能直接赋值修改(比如a.shape = (2,6)会报错,必须用reshape()生成新数组)。这些属性由数组的底层内存布局、数据类型等核心参数决定,numpy通过C扩展实现访问逻辑,而非存在于Python对象的__dict__中。

这是不是numpy ndarray不提供__dict__的原因?

是核心原因之一,再结合另外两点:

  • 性能优先:numpy是面向高性能数值计算的库,__dict__作为Python字典会带来额外内存开销和访问延迟,不符合C扩展类型的性能要求。
  • 设计定位:numpy数组属于“值对象”,核心状态(数据、形状、类型等)由底层严格管理,不允许用户随意添加自定义属性,自然不需要__dict__来存储动态属性。

替代的属性获取方式

没有__dict__也没关系:

  • 用dir(a)或a.__dir__()列出所有可用属性;
  • 用getattr(a, 属性名)获取具体属性值,比如getattr(a, 'shape')。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:33:33