np.ndarray.flatten未展开嵌套数组的问题求助
问题原因与解决办法
嘿,我一眼就瞅出问题所在了——你的myVar是个dtype为object的numpy数组,不是常规的多维数值数组,这就是flatten()没生效的核心原因!
为啥会出现这种情况?
当你创建numpy数组时,如果往里塞的元素本身就是数组对象(比如你手动把几个小数组丢进去,或者子数组长度不一样),numpy没法把它自动解析成多维数值数组,就会退而求其次,把整个数组的元素类型设为object——简单说,就是把每个子数组当成独立的“物件”存起来,而不是把它们看作多维数组的某一个维度。
你可以自己验证一下,跑个代码看看:
print(myVar.dtype) # 输出肯定是 object
这种情况下,flatten()只会处理数组的最外层结构,把外层的维度展平,但不会去碰里面的object元素——numpy根本不知道这些“物件”其实是数组,它只当它们是普通的对象而已。
该怎么解决?
根据你的需求,有两种常用的处理方式:
1. 把所有子数组拼接成一维数组
如果你的目标是把所有子数组里的元素合并成一个一维数组,直接用np.concatenate()就搞定了:
result = np.concatenate(myVar) print(result[0:2]) # 这下就能输出 [1 2] 啦
2. 先转成常规多维数组再展平
要是你所有的子数组长度都一样,那可以先把这个object数组转换成普通的多维数值数组,再调用flatten():
# 先转成二维数组,再展平 multi_d_array = np.stack(myVar) # 或者 np.array(myVar.tolist()) 也能行 result = multi_d_array.flatten() print(result[0:2]) # 同样能得到 [1 2]
再给你对比下两种数组的区别
举个直观的例子,你就能明白为啥行为不一样了:
# 正常的二维数值数组 normal_array = np.array([[1,2], [5,2]]) print(normal_array.flatten()) # 输出:[1 2 5 2] # 你的情况:object类型数组 object_array = np.array([np.array([1,2]), np.array([5,2])], dtype=object) print(object_array.flatten()) # 输出:[array([1, 2]) array([5, 2])]
这样是不是一下子就清楚了?
内容的提问来源于stack exchange,提问作者PDiracDelta
相关产品推荐
相关产品推荐

