- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我之前问过类似的问题,但我仍然不完全确定 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_
是构建此类元组的好方法,如果您更喜欢冒号语法的话)。
我想我可以从 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))
但这需要对数据的存储和访问方式有一定的了解。对于像这样的简单切片应该不会太难。对于更一般的,例如带有步进和转置的,会更难。
但我从来不需要这样做。保留原始切片元组更容易。如果你做高级索引(它创建一个副本而不是一个 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)
获取所有索引让我有点不爽。 meshgrid
和 mgrid
可以工作,但它们需要生成范围。我无法立即想到一个具有形状并给出相应 I,J
的函数。
I,J=np.array(list(np.ndindex(sub.shape))).T
会做,但不漂亮。
关于python - numpy ndarray 索引 - 从元组中检索索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37079640/
如何在每个新行创建一个新数组/元组? 就像我有这个循环来读取文件: for line in csv.reader(f, delimiter='\t', lineterminator='\t\t', d
我正在尝试将值写入(我可以很好地读取)MSSQL 实例。我的代码类似于: import pypyodbc lst = ['val1', 'val2', 'val3'] connection = pyp
我是一名优秀的程序员,十分优秀!