Numpy切片:等价于[:,2:3,1]和slice()表示法

6yt4nkrj  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(78)

我无法理解函数slice()与通常的Numpy索引符号的关系。

test = np.random.rand(4,4,4)
test[:,0:1,2]
>>> array([[0.73897606],
         [0.68005618],
         [0.32831257],
         [0.36882484]])

字符串
但我不知道接下来会发生什么

test[slice(None),slice(0,1),slice(2,3)]
>>>> array([[[0.73897606]],

           [[0.68005618]],

           [[0.32831257]],

           [[0.36882484]]])


一些实验似乎证实slice(None)等价于:slice(0,1)等价于0:1,但slice(2,3)等价于2,作为索引。
如何使用slice()函数描述[:,0:1,2]切片?
有人能给予我们点提示吗?我也不明白第二个输出的形状从何而来,非常感谢

编辑-附加背景

我希望能够做的是动态切片一个数组,给定一个输入。例如,给定一个形状为(10,10,10,10)的数组S,用户可以选择两个变量进行绘图,而将其他两个变量固定在选定的位置。例如,(surface)绘制第一个和第三个,将第二个和第四个保持在指数(2,3)处。我可以传递数组S[:,2,:,3]
根据Dynamically slice an array中的答案,我认为我应该有类似于

axis_to_plot_1 = 0
axis_to_plot_2 = 2
axis_to_slice_1 = 1
index_to_consider_1 = 2
axis_to_slice_2 = 3
index_to_consider_2 = 3
slc = [slice(None)] * len(S.shape)
slc[axis_to_slice_1] = slice(index_to_consider_1, index_to_consider_1 +1)
slc[axis_to_slice_2] = slice(index_to_consider_2, index_to_consider_2+1)


这将解决我的问题,我可以为:(绘图时要考虑的变量)和“i”索引情况(关于剩余维度的部分)都slice()
如何在两个轴上最好地实现上述动态切片,请提供任何想法?

sirbozc5

sirbozc51#

这是不等价的。2不是切片,而是索引。切片将保留维数,而索引将删除一个。
等效性为:

test[:, 0:1, [2]]

字符串
输出量:

array([[[0.42475402]],

       [[0.48023367]],

       [[0.95256927]],

       [[0.25481038]]])

相关问题