NDarray切片报错:TypeError: only integer scalar arrays can be converted to a scalar index
解决NDarray按行自定义起始/结束索引切片的TypeError问题
报错原因
你的代码中使用beginning[:, i]和end[:, i]这类数组作为切片的起始/结束参数,而numpy的切片语法要求切片的上下界必须是标量值,不能是数组,因此触发了TypeError: only integer scalar arrays can be converted to a scalar index。
解决方案
方案1:逐行使用标量索引(直观匹配原逻辑)
修改循环逻辑,逐行取出对应feature的起始/结束标量值,再执行切片赋值:
import numpy as np mask = - np.ones((3, 5)) num_features = 4 beginning = np.zeros((3, num_features), dtype=int) end = np.ones((3, num_features), dtype=int) * 3 # 遍历每一行,再遍历每个feature的切片范围 for row in range(mask.shape[0]): for i in range(num_features): start = beginning[row, i] end_idx = end[row, i] mask[row, start:end_idx] = 1 print(mask)
运行输出:
[[ 1. 1. 1. -1. -1.] [ 1. 1. 1. -1. -1.] [ 1. 1. 1. -1. -1.]]
方案2:广播生成布尔掩码(高效批量处理)
如果处理大规模数据,逐循环效率较低,可以利用numpy广播特性生成布尔掩码,一次性完成赋值:
import numpy as np mask = - np.ones((3, 5)) num_features = 4 beginning = np.zeros((3, num_features), dtype=int) end = np.ones((3, num_features), dtype=int) * 3 # 生成列索引数组,通过广播匹配mask的形状 cols = np.arange(mask.shape[1])[np.newaxis, :] for i in range(num_features): # 将起始/结束索引转为(3,1)形状,与cols广播比较 in_range = (cols >= beginning[:, i][:, np.newaxis]) & (cols < end[:, i][:, np.newaxis]) mask[in_range] = 1 print(mask)
内容的提问来源于stack exchange,提问作者th0mash
相关产品推荐
相关产品推荐

