在NumPy中创建不同维度的数组构成的数组时遇到问题
为什么NumPy在子数组第一维度相同时无法创建混合维度数组?
哈哈,这个问题我之前也踩过坑!本质是NumPy创建数组时的自动规整逻辑在搞鬼,咱们一步步拆解:
两种场景的底层逻辑差异
1. 子数组第一维度完全不同时
比如你创建这样的数组:
import numpy as np arr1 = np.array([1, 2]) # 维度(2,) arr2 = np.array([[1,2,3], [4,5,6], [7,8,9]]) # 维度(3,3) mixed_arr = np.array([arr1, arr2])
这时候NumPy会发现:两个子数组的第一维度(2 vs 3)完全不搭,根本没法拼成一个规整的多维数组(比如(2,3)或者(3,2)这种)。于是它会退而求其次,创建一个对象类型数组(dtype=object),把每个子数组当成独立的Python对象存进去,自然不会报错。
2. 子数组第一维度相同时
但如果两个子数组第一维度一致,比如:
arr1 = np.array([1, 2]) # 维度(2,) arr2 = np.array([[1,2], [3,4]]) # 维度(2,2) mixed_arr = np.array([arr1, arr2])
这时候NumPy的“强迫症”就犯了:它会默认尝试创建一个同质多维数组(所有元素维度统一,这样才能发挥NumPy向量化运算的优势)。它看到两个子数组第一维度都是2,就会想“能不能把它们拼成一个(2, N)的二维数组?”
但arr1是一维的(2,),arr2是二维的(2,2),后续维度不匹配,拼接失败,于是就抛出了维度不兼容的错误。
解决方法:强制创建对象数组
如果你就是想存不同维度的子数组,不管第一维度是否相同,只需要显式指定dtype=object,告诉NumPy“别瞎规整,就把它们当对象存”:
arr1 = np.array([1, 2]) arr2 = np.array([[1,2], [3,4]]) mixed_arr = np.array([arr1, arr2], dtype=object)
这样就能正常生成包含不同维度子数组的数组了,每个元素都是独立的NumPy数组对象。
内容的提问来源于stack exchange,提问作者Ale152
相关产品推荐
相关产品推荐

