Python创建嵌套列表时np.append扁平化数组,如何保留独立子列表?
问题根因
np.append()未指定axis参数时,会默认将所有输入内容展平为一维数组再拼接,因此子数组的结构会被打散,最终得到扁平的一维结果。
最优解决方案
直接改用Python原生列表的append()方法追加子数组,完全不需要用numpy的拼接逻辑,所有子元素追加完成后如果需要numpy格式再统一转换即可。同时你代码中冗余的多分支判断可以用映射表简化,修改后代码如下:
import numpy as np import random class poblacion: def generar(self): poblacion_p = np.random.randint(0,4,(10,10)) print(poblacion_p) self.individuos(poblacion_p) def individuos(self, poblacion_p): # 建立aptitude值到对应行索引的映射,替换冗余的变量和多分支判断 aptitud_to_idx = { 20:0, 19:7, 14:1, 12:5, 11:2, 9:8, 7:3, 5:6, 3:4, 1:9 } aptitudes = [1,3,5,7,9,11,12,14,19,20] nueva_g = [] aptitud = random.choices(aptitudes, weights=(5,15,25,35,45,63,65,67,75,80), k = 10) for c in aptitud: # 直接用列表append追加子数组,不会打平结构 nueva_g.append(poblacion_p[aptitud_to_idx[c]]) print(aptitud) # 如果需要numpy格式的二维数组,取消注释下面这行即可 # nueva_g = np.array(nueva_g) print(nueva_g)
补充:如果你一定要用numpy的拼接方法,也可以用
np.vstack或者给np.append指定axis=0,但需要提前初始化对应维度的空数组,操作复杂度比直接用列表append高,不推荐这种写法。
运行效果
修改后输出的nueva_g就是你预期的嵌套结构,如果你转成numpy数组,形状会是(10, 10),完全保留每一行子数组的独立性。
内容的提问来源于stack exchange,提问作者nooby_rails
相关产品推荐
相关产品推荐

