python - Python中多维数组的非连续切片
问题描述
我正在尝试对这样的多维数组执行非连续切片(Matlab peudo 代码)
A = B(:,:,[1,3],[2,4,6]) %A and B are two 4D matrices
但是当我尝试用 Python 编写这段代码时:
A = B[:,:,np.array([0,2]),np.array([1,3,5])] #A and B are two 4D arrays
它给出了一个错误:IndexError: shape mismatch: indexing arrays could not be broadcast...
应该注意的是,每次切片一维效果很好!
解决方案
在numpy
中,如果你使用多个花式索引(即array
)同时索引同一个数组的不同维度,它们必须广播。这样做的目的是使索引可以更强大。对于您的情况,解决问题的最简单方法是索引两次:
B[:, :, [0,2]] [..., [1,3,5]]
where...
代表尽可能多:
的。
以这种方式索引两次会产生一些额外的数据移动时间。如果您只想索引一次,请确保它们广播(即在不同维度上放置精美的索引):
B[:, :, np.array([0,2])[:,None], [1,3,5]]
这将导致一个X by Y by 2 by 3
数组。另一方面,你也可以这样做
B[:, :, [0,2], np.array([1,3,5])[:,None]]
这将导致一个X by Y by 3 by 2
数组。轴在轴[1,3,5]
之前转置[0,2]
。
np.array([0,2])
如果您不需要对其进行花哨的操作,则不必使用它。简单[0,2]
就好。
np.array([0,2])[:,None]
等价于[[0],[2]]
,其中的重点[:,None]
是创建一个额外的维度,使形状变为(2,1)
。形(2,)
而(3,)
不能播,形(2,1)
而(3,)
能,则成(2,3)
。
推荐阅读
- python - Scipy 在没有约束的情况下最小化 SLSQP
- python-3.x - Django如何通过单击带有变量的提交按钮从ajax调用views.py中的函数
- vba - 将文档从 2 到 7 页拆分为每页一个新文档
- wordpress - 如何修复 WordPress 网站中的图像源?
- android - 按奇偶顺序为cardView设置不同的背景颜色
- javascript - 使用单个按钮切换图像
- c# - BPost地址验证C# REST调用不成功
- c++ - OpenGL中的旋转立方体
- java - 如何在反应原生应用程序中使用 FLAG_INSISTENT
- apache-kafka - 如何通过拉取查询在 Kafka 和 ksqldb 中获取摘要/聚合表