如何优雅实现布尔数组→整数数组→位移运算→求和的代码优化方案
这里有个更简洁优雅的实现方案,充分利用numpy的向量化操作替代嵌套循环,同时保持逻辑清晰,扩展性也更好(哪怕后续cond追加到7个元素也无需修改核心逻辑):
import numpy as np import pandas as pd # 直接初始化条件数组为numpy数组,一步到位 cond = np.array([ [True, False, True, False, False, True], [False, True, False, True, True, False] ], dtype=np.int8) # 指定int8类型节省内存 # 生成对应每一行的位移量,转成列向量实现广播 shifts = np.arange(cond.shape[0])[:, np.newaxis] # 向量化执行位移操作,替代嵌套循环 shifted_cond = cond << shifts # 转置后转成DataFrame,同时添加sum列 df = pd.DataFrame(shifted_cond.T).assign(sum=lambda x: x.sum(axis=1))
为什么这个方案更优?
- 精简初始化流程:直接用
np.array定义数据,省去了先append列表再转numpy的冗余步骤; - 替代嵌套循环:借助numpy的广播机制,让每一行的所有元素自动对应左移该行的索引值,代码更简洁的同时,运算效率远高于Python原生循环(数据量越大优势越明显);
- 扩展性拉满:哪怕后续cond追加到7个元素,只需要在初始化数组时添加新行即可,核心的位移、求和逻辑完全不用改动;
- 内存更高效:指定
dtype=np.int8,用最小的整数类型存储数据,避免不必要的内存消耗。
运行后得到的结果和你期望的完全一致:
0 1 sum 0 1 0 1 1 0 2 2 2 2 1 0 3 0 2 2 4 0 2 2 5 1 0 1
内容的提问来源于stack exchange,提问作者Donghee Seo
相关产品推荐
相关产品推荐

