如何根据布尔向量修改Python列表元素并选择适配的OBJ?
问题解决思路
一、用布尔向量修改列表L的方法
Python原生列表不支持像numpy数组那样直接用布尔索引赋值(L[indices]=OBJ会报错,因为列表索引只能是整数或切片),要实现需求可以用这两种方法:
方法1:遍历索引手动修改
import numpy as np L = [-1, 3, 4, -2, 6] indices = np.array([1, 0, 0, 1,1], dtype=bool) OBJ = ... # 你要的目标取值 for i, flag in enumerate(indices): if flag: L[i] = OBJ
执行后L就会变成[OBJ, 3, 4, OBJ, OBJ]
方法2:转numpy数组操作后转回列表
如果不介意临时转数组,这种写法更简洁:
import numpy as np L = [-1, 3, 4, -2, 6] indices = np.array([1, 0, 0, 1,1], dtype=bool) OBJ = ... arr = np.array(L) arr[indices] = OBJ L = arr.tolist()
二、关于OBJ的取值判断
直接给结论:OBJ=[]或None都不可行,原因和替代方案如下:
1. 为什么None不行?
None是Python的空值类型,和任何数值做乘法、加法都会直接报错。稀疏向量的点积本质是「元素对应相乘后求和」,假设稀疏向量里有数值元素,计算时None * 数值会抛出TypeError,根本无法完成运算。
2. 为什么[]不行?
空列表和数值运算虽然不会报错(比如2 * []得到[]),但稀疏向量的点积是数值运算逻辑,列表属于容器类型,和scipy稀疏矩阵/向量运算会直接报错,逻辑上也不符合点积的行为要求。
3. 满足需求的OBJ实现
要实现「和任意稀疏向量点积后结果仍为OBJ,且效率极高」,可以定义一个单例对象,重载乘法和加法的魔法方法:
class IdentityObj: def __mul__(self, other): return self def __rmul__(self, other): return self def __add__(self, other): return self def __radd__(self, other): return self OBJ = IdentityObj()
这个对象不管和什么数值相乘、相加,都会返回自己,所以稀疏向量点积(相乘后求和)的结果必然还是它本身。而且因为是单例,运算时没有额外开销,效率极高。
内容的提问来源于stack exchange,提问作者mandu soju
相关产品推荐
相关产品推荐

