Matplotlib 3D体素RGB绘图示例中np.index_exp[]索引机制疑问
midpoints函数索引逻辑问题解答
首先纠正一个认知偏差:
np.index_exp[:-1]返回的是(slice(None, -1, None),),含义是取目标维度除最后一个元素外的所有元素。你提到的(slice(None,None,-1),)是np.index_exp[::-1]的返回值,对应倒序取整个维度的全部元素,二者逻辑完全不同。
你观察到的差异核心原因是:循环内打印时用到的x已经不是你最初输入的原始数组,而是经过相邻元素求和后的新数组,完整逻辑拆解如下:
sl变量的作用是锁定已经处理完成的维度:初始为空元组,每轮循环结束会追加一个[:],保证后续循环只会对未处理的更高维度做切片,不会修改已处理维度的取值范围,以此实现逐维度计算中点的效果。- 我们用你给出的示例场景验证:
你提到的原始输入x第0维长度为3,直接对原始x做
x[np.index_exp[:-1]]会得到前两个元素:[[[0 0 0],[0 0 0],[0 0 0]], [[1 1 1],[1 1 1],[1 1 1]]]
进入第一轮循环后,代码会先执行x = x[:-1] + x[1:],也就是原始x的前两个元素和后两个元素对应相加,得到的新x第0维长度变为2,值为:
[[[1 1 1],[1 1 1],[1 1 1]], [[2 2 2],[2 2 2],[2 2 2]]]
此时你对这个新x执行x[np.index_exp[:-1]],取的是新x第0维除最后一个元素外的内容,自然只有[[[1 1 1],[1 1 1],[1 1 1]]]这部分输出。
这个函数的设计目的是对输入的多维度数组逐维度计算相邻元素的平均值(示例中只做了求和,后续会补充除以2的步骤),最终输出数组的每个维度长度都比输入小1,刚好对应原始网格的中点坐标。
内容的提问来源于stack exchange,提问作者Peng A
相关产品推荐
相关产品推荐

