np.index_exp[]如何在具有rgb颜色的3D体素/体积图中工作



我正在阅读示例:https://matplotlib.org/stable/gallery/mplot3d/voxels_rgb.html#sphx-glr-gallery-mapt3d-boxels-rgb-py关于创建三维球体。但我不明白这个例子中的索引是如何工作的。有人能帮我理解吗。感谢

> def midpoints(x):
> sl = ()
> for i in range(x.ndim):
>>    x = (x[sl + np.index_exp[:-1]] + x[sl + np.index_exp[1:]])
>>    sl += np.index_exp[:]
>>    print(np.index_exp[:-1])
>>    print(x[np.index_exp[:-1]])
I know the "index_exp[:-1]" returns (slice(None,None,-1),) and "x[index_exp[:-1]]" will give result like this:
[[[0 0 0],
[0 0 0],
[0 0 0]],
[[1 1 1],
[1 1 1],
[1 1 1]]]
But I don't understand how the ```x[index_exp[:-1]]``` in the for loop only shows:
[[[1 1 1],
[1 1 1],
[1 1 1]]]

在本例中,x是产生的(17,17,17(阵列之一

In [208]: r, g, b = np.indices((17, 17, 17)) / 16.0
...: rc = midpoints(r)
...: gc = midpoints(g)
...: bc = midpoints(b)

indices类似于meshgridmgrid,创建网格阵列。

我没有使用过np.index_exp,但我看到它和np.s_一样,只是它总是返回一个元组

In [225]: x = r.copy()
In [226]: ()+np.index_exp[:-1]    # so this tuple can joined with sl
Out[226]: (slice(None, -1, None),)
In [227]: x[()+np.index_exp[:-1]].shape
Out[227]: (16, 17, 17)
In [228]: x[:-1].shape
Out[228]: (16, 17, 17)

所以

x = (x[sl + np.index_exp[:-1]] + x[sl + np.index_exp[1:]])/2.0

对于初始sl,这是

x = (x[:-1] + x[1:])/2.0

x[1:]-x[:-1]被广泛用于取相邻元素之间的差np.diff。在这里,它只作用于(3的(第一个维度。这只是相邻点的平均值。注意,x[:-1]x[1:]都是(16,17,17(阵列。

下一位只是将[:]切片添加到sl:

In [230]: sl += np.index_exp[:]
In [231]: sl
Out[231]: (slice(None, None, None),)
In [232]: sl + np.index_exp[:-1]
Out[232]: (slice(None, None, None), slice(None, -1, None))

所以这是在做

x[:, :-1]     # which should be a (17,16,17) array

和下一次迭代CCD_ 14

r仅在第一维度上变化,因此可以将其值与具有以下的midpoints进行比较

In [249]: r1 = midpoints(r)
In [250]: r[:5,0,0]
Out[250]: array([0.    , 0.0625, 0.125 , 0.1875, 0.25  ])
In [251]: r1[:4,0,0]
Out[251]: array([0.03125, 0.09375, 0.15625, 0.21875])

因此,使用index_exp只允许他们以适用于所有3个维度rg的通用方式写入(x[:-1]+x[1:])/2平均值。b阵列/

最新更新