为何numpy.array创建类字典对象数组与普通dict数组行为不同?
为什么numpy.array对普通dict和自定义ArrayDict的处理行为不同?
核心原因是numpy对内置类型(比如dict)有特殊的类型检测逻辑,优先级远高于通用的可迭代/序列类型判断,具体细节如下:
内置dict的特殊判定:numpy在创建数组时,会先检查输入对象是否属于它预定义的「非数值容器」类型,dict就是其中之一。对于这类对象,numpy不会尝试去遍历它的迭代器,而是直接把整个dict当作单个元素放进数组,最终数组的dtype会变成
object。自定义类的通用逻辑:你的ArrayDict是用户自定义类型,numpy没有针对它的硬编码规则,所以会走通用的序列类型判断逻辑。当类实现了
__len__、__iter__和__getitem__(且没实现__array__)时,numpy会把它视为序列,通过迭代器遍历元素(类似dict的类默认迭代器返回键),再把这些遍历出的元素作为数组的内容。额外验证点:如果给ArrayDict加上
__array__方法,numpy会优先调用这个方法来生成数组,不再走迭代器逻辑;但哪怕你给普通dict动态添加__array__方法,numpy的内置检测依然会把它当作object类型处理——因为它对内置类型的判断是硬编码在源码里的。
举个直观的代码例子:
import numpy as np class ArrayDict: def __init__(self, data): self.data = data def __len__(self): return len(self.data) def __iter__(self): return iter(self.data) def __getitem__(self, key): return self.data[key] ad = ArrayDict({"a":1, "b":2}) print(np.array((ad, ad))) # 输出 [['a' 'b'] ['a' 'b']] data = {"a":1, "b":2} print(np.array((data, data))) # 输出 [{'a': 1, 'b': 2} {'a': 1, 'b': 2}]
内容的提问来源于stack exchange,提问作者cosama
相关产品推荐
相关产品推荐

