Python numpy ndarray索引-从元组检索索引

Python numpy ndarray索引-从元组检索索引,python,arrays,numpy,Python,Arrays,Numpy,我以前也问过类似的问题,但我仍然不能完全确定numpy是如何组织其指数的 我正在使用许多3D阵列,所有这些阵列的大小都相同。由于以后的操作(使用scipy和其他工具查看为窗口),我需要对阵列进行切片,这是我正在进行的一系列操作,如下所示: imFrag.append(Padded[:100, :100, :100) 将阵列分成8个部分。我试图获得每个切片的原始索引。我可以使用以下方法对整个3d阵列执行此操作: np.where(Mat == Mat) 这给了我一个包含x、y和z分量的元组

我以前也问过类似的问题,但我仍然不能完全确定numpy是如何组织其指数的

我正在使用许多3D阵列,所有这些阵列的大小都相同。由于以后的操作(使用scipy和其他工具查看为窗口),我需要对阵列进行切片,这是我正在进行的一系列操作,如下所示:

imFrag.append(Padded[:100, :100, :100)
将阵列分成8个部分。我试图获得每个切片的原始索引。我可以使用以下方法对整个3d阵列执行此操作:

np.where(Mat  == Mat) 
这给了我一个包含x、y和z分量的元组。我有办法做到这一点吗


谢谢

考虑存储切片对象,而不是碎片本身

your_slice = np.s_[:100, :100, :100]
要获得图像,只需

Padded[your_slice]
获取用于创建切片的索引

your_slice[0].start
your_slice[0].step
your_slice[0].stop

对于您关心的任何维度,让我们尝试一些小的2d:

In [102]: Mat = np.arange(16).reshape(4,4)    
In [103]: sub = Mat[2:,:2]

In [104]: Mat
Out[104]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

In [105]: sub
Out[105]: 
array([[ 8,  9],
       [12, 13]])
您是否想知道如何辨别
sub
是否发生在
Mat

在一般实践中,最好的方法是保留索引元组

In [106]: ind=(slice(2,None),slice(None,2))

In [107]: Mat[ind]
Out[107]: 
array([[ 8,  9],
       [12, 13]])

In [108]: Mat[ind] += sub   # duplicate the sub values

In [109]: Mat
Out[109]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [16, 18, 10, 11],
       [24, 26, 14, 15]])
np.s
如果您喜欢冒号语法,那么它是构造这样一个元组的好方法)

我想我可以从
Mat
sub
中的信息推断出这个切片,例如

In [120]: Mat.__array_interface__['data'][0],Mat.shape,Mat.strides,Mat.itemsize
Out[120]: (169022104, (4, 4), (16, 4), 4)

In [121]: sub.__array_interface__['data'][0],sub.shape,sub.strides
Out[121]: (169022136, (2, 2), (16, 4))
但它需要了解数据的存储和访问方式。对于像这样的简单切片,这应该不会太难。对于更一般的,比如带有阶跃和转置的,这会更困难

但我从来没有必要这么做。保留原始切片元组更容易。如果您执行高级索引(即创建副本而不是视图),则挂起索引或屏蔽是唯一的方法

=====================

以下是你的评论:

In [140]: I,J=np.where(sub==sub) 

In [141]: ind
Out[141]: (slice(2, None, None), slice(None, 2, None))

In [142]: Mat[2+I,0+J]    # 0 inplace of None for J
Out[142]: array([16, 18, 24, 26])
因此,可以使用
sub
中的索引在
Mat
中查找相应的元素。使用
where(sub==sub)
获取所有索引让我有点烦
meshgrid
mgrid
将起作用,但它们需要生成范围。我不能马上想到一个函数,它具有一个形状并给出相应的
I,J

I,J=np.array(list(np.ndindex(sub.shape))).T

可以,但不漂亮。

那么
imFrag
是一个列表吗?也许我误解了最后一部分的“告诉我们发生在Mat中?”。切片后,我试图访问的是sub中每个元素的坐标。使用您的示例:((2,2,3,3),(2,3,2,3))将是sub的高级索引。作为一种解决方法(告诉我这是否荒谬),我可以得到np.where索引,只需将最低的切片添加到每个元组?是的,您可以使用slice
start
属性将
sub
索引应用于
Mat
。查看我的编辑。谢谢:)一如既往地非常有用!