【问题标题】:Non-consecutive slicing of a multidimensional array in PythonPython中多维数组的非连续切片
【发布时间】:2018-10-30 21:06:12
【问题描述】:

我正在尝试对这样的多维数组执行非连续切片(Matlab 伪代码)

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

需要注意的是,每次切片一维效果很好!

【问题讨论】:

  • 您应该在问题中包含AB,以及您的预期输出
  • 什么是 B?列表还是 numpy 数组?
  • 那段代码不能给你那个错误。唯一的索引数组是 np.array([0,2])np.array([1,3]),它们 可以 一起广播,它不会像在 matlab 中那样做,并且索引是关闭的,但它不应该给你错误。请提出正确的minimal reproducible example 并运行它以检查它是否重现了您的问题。
  • 您需要np.ix_One relevant duplicateanother one。前者的 top-voted 答案显示了如何使用它。另外不要忘记,虽然 MATLAB 索引是从 1 开始的,但 numpy 索引是从 0 开始的。
  • @AndrasDeak。我在上面的代码中错了。两个索引向量的长度不同。

标签: python matlab numpy


【解决方案1】:

numpy中,如果你使用多个花式索引(即array)同时索引同一个数组的不同维度,它们必须广播。这样做的目的是使索引可以更强大。对于您的情况,解决问题的最简单方法是索引两次:

B[:, :, [0,2]] [..., [1,3,5]]

其中... 代表尽可能多的:

以这种方式索引两次会产生一些额外的数据移动时间。如果您只想索引一次,请确保它们广播(即将精美的索引放在不同的维度上):

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)

【讨论】:

    猜你喜欢
    • 2018-02-23
    • 2018-03-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 2020-01-15
    • 2017-08-09
    相关资源
    最近更新 更多