如何提取numpy数组的二维矩阵部分?解决索引类型错误
问题与解决方法
问题描述
我有一个由numpy数组组成的列表mask_arr,列表内每个元素都是numpy数组,示例输出如下:
mask_arr[0][:] array([[255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255], ..., [255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255]], dtype=uint8)
我需要提取不含dtype部分的二维数组文本,目标结果如下:
[[255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255], ..., [255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255], [255, 255, 255, ..., 255, 255, 255]]
同时我遇到了以下错误:
im = mask_arr[i] *** TypeError: only integer scalar arrays can be converted to a scalar index
解决方法
1. 提取不含dtype的数组文本
方法一:转成Python列表后输出
直接将numpy数组转换为Python原生列表,再转成字符串,自然不会包含dtype信息:
# 获取第一个元素的列表形式字符串 target_str = str(mask_arr[0].tolist()) print(target_str)
方法二:切割numpy数组的字符串输出
如果需要保留numpy的省略号格式,可对数组的字符串输出进行截取:
arr_str = str(mask_arr[0]) # 移除开头的"array("和结尾的", dtype=uint8)" clean_str = arr_str[6:-17] print(clean_str)
注意:此方法依赖numpy的固定输出格式,若数组dtype不是uint8,需要调整结尾截取的长度。
2. 修复TypeError错误
这个错误和文本提取无关,问题出在索引i的类型上:
- 如果
i是numpy数组而非整数标量,需先将其转为整数:
# 将数组索引转为整数标量 i = i.item() im = mask_arr[i]
- 如果
i是包含多个索引的数组,用列表推导式批量获取元素:
im_list = [mask_arr[idx.item()] for idx in i]
- 另外确认
mask_arr是Python列表而非numpy数组:若它是numpy数组,索引方式应为mask_arr[i, :]而非mask_arr[i]。
内容的提问来源于stack exchange,提问作者S.EB
相关产品推荐
相关产品推荐

