np.index_exp[] 如何在带有 rgb 颜色示例的 3D 体素/体积图中工作
how does the np.index_exp[] work in the 3D voxel / volumetric plot with rgb colors example
我正在阅读示例:https://matplotlib.org/stable/gallery/mplot3d/voxels_rgb.html#sphx-glr-gallery-mplot3d-voxels-rgb-py 关于创建 3d 球体。
但我不明白示例中的索引是如何工作的。任何人都可以帮助我理解。谢谢
> 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
类似于 meshgrid
和 mgrid
,创建网格数组。
我没用过np.index_exp
,但我看到它和np.s_
一样,除了它总是returns一个元组
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
和下一次迭代 x[:,:, :-1] # (17,17,16)
这个 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 个维度的一般方式编写 (x[:-1]+x[1:])/2
平均 r
, g
.b
阿劳斯/
我正在阅读示例:https://matplotlib.org/stable/gallery/mplot3d/voxels_rgb.html#sphx-glr-gallery-mplot3d-voxels-rgb-py 关于创建 3d 球体。 但我不明白示例中的索引是如何工作的。任何人都可以帮助我理解。谢谢
> 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
是
In [208]: r, g, b = np.indices((17, 17, 17)) / 16.0
...: rc = midpoints(r)
...: gc = midpoints(g)
...: bc = midpoints(b)
indices
类似于 meshgrid
和 mgrid
,创建网格数组。
我没用过np.index_exp
,但我看到它和np.s_
一样,除了它总是returns一个元组
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
和下一次迭代 x[:,:, :-1] # (17,17,16)
这个 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 个维度的一般方式编写 (x[:-1]+x[1:])/2
平均 r
, g
.b
阿劳斯/