numpy数组经同形状布尔掩码索引后形状异常原因咨询
原因解释
你对NumPy布尔掩码索引的返回规则存在误解:
- 当使用和原数组形状一致的布尔数组做索引时,NumPy不会返回原数组展平后的全部元素,只会提取掩码中值为
True的位置对应的元素,最终返回的一维数组长度,完全等于掩码里True值的总个数,和原数组总元素量没有强制相等的关系。
1300587这个数值的来源
这个数就是你手里的布尔掩码里,所有取值为True的元素总计数。你可以直接运行以下代码验证:
print(mask.sum())
运行输出的结果一定是1300587——因为NumPy中布尔类型的True等价于整数1、False等价于整数0,对布尔掩码直接求和,得到的就是所有真值的总个数。
和预期结果不一致的原因
你算出的224*224*160=8028160是原数组的全部元素总数,只有当你的布尔掩码**所有位置全为True**时,掩码索引返回的数组长度才会等于这个值,形状为(8028160,)。
你当前的掩码里只有1300587个位置是True,剩余6727573个位置均为False,这些False位置对应的元素会被直接过滤,不会进入最终返回的new数组,因此最终得到的数组长度就是1300587。
可以用极简示例复现这个规则:
import numpy as np test_arr = np.array([1,2,3,4]) test_mask = np.array([True, False, True, False]) print(test_arr[test_mask]) # 输出[1 3],长度为2,等于掩码中True的个数,而非原数组总长度4
内容的提问来源于stack exchange,提问作者Kate S.D.
相关产品推荐
相关产品推荐

