gpt4 book ai didi

python - numpy ndarray 索引 - 从元组中检索索引

转载 作者:太空宇宙 更新时间:2023-11-04 03:13:38 25 4
gpt4 key购买 nike

我之前问过类似的问题,但我仍然不完全确定 numpy 是如何组织其索引的。

我正在处理许多 3D 数组,所有这些数组的大小都相同。由于后来的操作(用 scipy 和其他人查看窗口),我需要对我正在做的一系列操作的数组进行切片,如下所示:

imFrag.append(Padded[:100, :100, :100)

将数组分成 8 block 。我正在尝试获取每个切片的原始索引。我可以使用以下方法对整个 3d 数组执行此操作:

np.where(Mat  == Mat) 

这给了我一个包含 x、y 和 z 分量的元组。有什么办法可以做到这一点?

谢谢!

最佳答案

让我们尝试一些小的和二维的:

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_ 是构建此类元组的好方法,如果您更喜欢冒号语法的话)。

我想我可以从 Matsub 中的信息推断出这种切片,例如

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))

但这需要对数据的存储和访问方式有一定的了解。对于像这样的简单切片应该不会太难。对于更一般的,例如带有步进和转置的,会更难。

但我从来不需要这样做。保留原始切片元组更容易。如果你做高级索引(它创建一个副本而不是一个 View ),坚持索引或屏蔽是唯一的方法。

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

根据您的评论:

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) 获取所有索引让我有点不爽。 meshgridmgrid 可以工作,但它们需要生成范围。我无法立即想到一个具有形状并给出相应 I,J 的函数。

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

会做,但不漂亮。

关于python - numpy ndarray 索引 - 从元组中检索索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37079640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com