Numpy从列表映射值追加到数组时代码不生效的原因及解决方法
问题核心原因
np.append()并非原地修改方法,调用后仅会返回拼接后的新数组,不会修改原数组对象。你的代码没有将np.append()的返回值赋值回beta,因此beta始终保持初始空数组的状态。- 循环逐个追加元素的写法性能极低,不适用于Numpy数组操作场景。
最小改动修复方案
仅需将每次np.append()的结果赋值回beta即可运行,如需整数类型可在初始化时指定dtype:
import numpy as np list_1 = ['sentosa', 'versicolor', 'virginica', 'virginica', 'sentosa'] beta = np.array([], dtype=int) for x in list_1: if x == "sentosa": beta = np.append(beta, 1, axis=0) elif x == "versicolor": beta = np.append(beta, 2, axis=0) elif x == "virginica": beta = np.append(beta, 3, axis=0)
运行后beta结果为array([1, 2, 3, 3, 1])。
更高效的推荐实现
无需编写循环,使用字典映射配合向量化操作即可,代码更简洁、性能更高:
import numpy as np list_1 = ['sentosa', 'versicolor', 'virginica', 'virginica', 'sentosa'] map_rule = {'sentosa':1, 'versicolor':2, 'virginica':3} beta = np.vectorize(map_rule.get)(list_1)
如果你不需要手动指定映射值,希望自动为每个不同的名称分配唯一整数编码,可以使用np.unique的return_inverse参数:
import numpy as np list_1 = ['sentosa', 'versicolor', 'virginica', 'virginica', 'sentosa'] # 得到的mapping是从0开始的整数编码,需要从1开始的话直接加1即可 _, mapping = np.unique(list_1, return_inverse=True) beta = mapping + 1
内容的提问来源于stack exchange,提问作者Amateur1
相关产品推荐
相关产品推荐

