为何创建不规则数组仅在h=3时触发ValueError?如何解决?
异常原因分析
当h=3时,两个输入数组的形状分别是(3,4)和(3,3),都是二维数组且第一维度长度相同(均为3)。numpy执行np.array(..., dtype=object)时,会优先尝试将输入数组当作常规数值数组做形状对齐与广播,而非直接创建object数组。此时它会误判你要创建一个二维数组,尝试按第二维度拼接两个数组,但前者第二维度是4、后者是3,无法匹配广播规则,于是抛出ValueError。
而当h≠3时,比如h=2,两个数组形状为(2,4)和(3,2),第一维度长度不同(2 vs 3),numpy无法将它们对齐成常规多维数组,这时候才会按照指定的dtype=object,把两个数组作为独立对象存入数组,不会触发广播错误。
解决方法
有两种简单方式可以规避这个问题:
- 手动初始化object数组再赋值
先创建指定长度的空object数组,再分别赋值两个数组,跳过numpy自动的广播尝试:
import numpy as np for h in range(10): array = np.empty(2, dtype=object) array[0] = np.zeros((h, 4)) array[1] = np.zeros((3, h))
- 给每个数组增加额外维度
通过[None]给每个数组新增一个维度,让numpy无法将它们对齐成常规二维数组,从而直接创建object数组:
import numpy as np for h in range(10): array = np.array([np.zeros((h, 4))[None], np.zeros((3, h))[None]], dtype=object)
内容的提问来源于stack exchange,提问作者scribe
相关产品推荐
相关产品推荐

