最近做项目使用cv2.findContours()函数的时候遇到了高维矩阵的索引问题,一番寻找之后找到了答案,因此特地前来记录一下解决方案。 假设我们的数组为:(之所以这么假设是因为这与我使用的函数返回值shape相同)
a = np.array([[[1, 2]], [[3, 4]], [[5, 6]], [[7, 8]], [[9, 10]]])
换一个更明显的写法就是:
a = np.array([
[[1, 2]],
[[3, 4]],
[[5, 6]],
[[7, 8]],
[[9, 10]]
])
注意:其shape为(5,1,2)而不是我们认为的(5, 2),这就是opencv返回的数组与我们常见的numpy中的数组的区别。 因此,取出其中元素的操作,a[:, 0]的结果是:
[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]
这个操作的含义就是取出第一轴的所有元素和第二个轴的第一个元素,可以发现,a[:,0]等价于a[0:5,0](使用:(冒号)可以索引当前轴的所有元素)。另外,a[:,0]也等价于a[0:5,0,0:2],因为索引只针对前两个轴,故默认索引第三个轴的全部元素。 从层次的角度分析(numpy数组的访问区间默认是左闭右开区间即[ ),因此右侧的值取不到,左侧的值可以取到): ①、对于a数组,去掉最外层的方括号,还剩5个元素,每个元素都是 [[1, 2]] 这种形状。因此第一个轴的索引范围是[0, 5],即为0~5, ②、对于内层方括号即[[3, 4]],其中只有一个元素,即[3, 4],所以第二个轴的索引范围为[0, 1],即0~1, ③、对于最内层方括号即[3, 4],其中有两个元素,所以第三个轴的索引范围为[0, 2],即0~2。
|