Python numpy ndarray索引-从元组检索索引
我以前也问过类似的问题,但我仍然不能完全确定numpy是如何组织其指数的 我正在使用许多3D阵列,所有这些阵列的大小都相同。由于以后的操作(使用scipy和其他工具查看为窗口),我需要对阵列进行切片,这是我正在进行的一系列操作,如下所示: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分量的元组
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索引,只需将最低的切片添加到每个元组?是的,您可以使用slicestart
属性将sub
索引应用于Mat
。查看我的编辑。谢谢:)一如既往地非常有用!