如何使用多个索引对numpy数组进行多次拆分且不使用循环?
Numpy 无循环按多索引拆分数组实现
因为拆分后各子数组长度不一致,最终结果只能是object类型数组,你可以通过np.vectorize封装拆分逻辑,完全避免显式循环语法,实现向量化调用。
完整可运行实现代码如下:
import numpy as np # 初始化输入数组和拆分索引 y = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) split_points = np.array([2, 4, 7]) # 定义单拆分点的拆分逻辑 def split_single(n): # np.split第二个参数是拆分位置列表,[n]表示在索引n处拆成两段 return np.split(y, [n]) # 封装为向量化函数,指定输出为object类型适配不等长数组 vec_split = np.vectorize(split_single, otypes=[object]) # 调用得到结果 res = vec_split(split_points)
运行后输出的res结构和需求完全一致:
array([[array([0, 1]), array([2, 3, 4, 5, 6, 7, 8, 9])], [array([0, 1, 2, 3]), array([4, 5, 6, 7, 8, 9])], [array([0, 1, 2, 3, 4, 5, 6]), array([7, 8, 9])]], dtype=object)
如果需要转成嵌套列表格式,调用res.tolist()即可。
补充说明
np.vectorize是numpy提供的函数包装工具,会自动遍历输入的拆分索引数组的每个元素调用拆分逻辑,不需要手动编写循环,符合向量化操作的使用习惯。如果你接受极简的列表推导写法(性能和上述方案基本一致,只是语法上有循环关键词),也可以用一行代码实现:
res = [np.split(y, [n]) for n in [2,4,7]]
内容的提问来源于stack exchange,提问作者Benjamin Tan
相关产品推荐
相关产品推荐

