Python中创建扁平化一维数组时输出不符合预期的问题求助
解决numpy数组出现嵌套元素的问题
嘿,我来帮你搞定这个问题!你遇到的情况是因为np.repeat(3,3)返回的本身就是一个numpy数组,而你指定了dtype="object",numpy就会把这个数组当作一个单独的对象元素放进最终数组里,导致出现嵌套结构。下面给你几个简单有效的解决办法:
方法1:构造列表时直接展开元素
先把np.repeat的结果转换成普通列表,再用解包运算符*把列表元素展开,和其他元素一起组成新列表后转成numpy数组:
import numpy as np lst_2 = np.array([1, 2, *np.repeat(3, 3).tolist(), 2]) print(lst_2) # 输出:[1 2 3 3 3 2]
方法2:用numpy的拼接函数组合
利用np.concatenate把多个一维数组拼接成一个大的一维数组,这样所有元素都会被统一处理,不会出现嵌套:
import numpy as np lst_2 = np.concatenate([[1, 2], np.repeat(3, 3), [2]]) print(lst_2) # 输出:[1 2 3 3 3 2]
方法3:事后展开已有的嵌套对象数组
如果已经生成了那个带嵌套的对象数组,也可以通过以下方式展开:
方式A:使用np.hstack
import numpy as np lst_2 = np.array([1,2,np.repeat(3,3),2],dtype="object") lst_2_flattened = np.hstack(lst_2) print(lst_2_flattened) # 输出:[1 2 3 3 3 2]
方式B:列表推导式遍历展开
import numpy as np lst_2 = np.array([1,2,np.repeat(3,3),2],dtype="object") lst_2_flattened = np.array([ item for element in lst_2 for item in (element if isinstance(element, np.ndarray) else [element]) ]) print(lst_2_flattened) # 输出:[1 2 3 3 3 2]
简单总结下:之所以出现嵌套,核心是dtype="object"允许数组存储不同类型的元素,而np.repeat的结果被当成一个对象存入了数组。推荐在构造阶段就用前两种方法避免生成对象数组,这样更符合numpy的使用习惯哦~
内容的提问来源于stack exchange,提问作者msci
相关产品推荐
相关产品推荐

