NumPy创建数组对象数组时广播行为不一致问题问询
问题成因
np.array创建数组时的默认处理逻辑优先级为:尝试堆叠生成同类型多维度数值数组 > 生成object类型数组,你传入的dtype=np.ndarray本质等价于dtype=object,不会改变这个前置的堆叠判断逻辑:
- 触发报错的场景:两个子数组
a(shape=(1,2))、b(shape=(1,3))的第0维长度一致,都是1,NumPy会判定两个数组可以尝试沿更高维度堆叠,于是尝试对齐后续维度,发现第1维长度2和3无法广播匹配,最终抛出广播错误。 - 正常返回的场景:两个子数组
a(shape=(1,2))、b(shape=(2,4))的第0维长度就不一致(1 vs 2),NumPy直接判定无法堆叠为同维度数值数组,直接回退生成object数组,把两个子数组作为独立元素存入,符合你的预期。
这个行为是NumPy的原生设计逻辑,和你使用的1.21.2版本无关,后续正式版本也保留了该处理逻辑。
解决方法
最稳妥的方案是避开np.array的自动堆叠逻辑,先创建空的object数组再手动赋值,适配所有子数组形状场景:
import numpy as np a = np.ones((1, 2)) b = np.ones((1, 3)) # 先创建长度匹配的空object数组 res = np.empty(len([a, b]), dtype=object) # 批量赋值,不会触发广播判断 res[:] = [a, b]
运行后即可得到你预期的输出:
array([array([[1., 1.]]), array([[1., 1., 1.]])], dtype=object)
如果需要处理大量元素,可以用np.fromiter简化写法:
res = np.fromiter([a, b], dtype=object)
内容的提问来源于stack exchange,提问作者Louis Hulot
相关产品推荐
相关产品推荐

