【问题标题】:Slicing matrix in for loop with index in python在for循环中用python中的索引切片矩阵
【发布时间】:2019-10-11 15:32:57
【问题描述】:

我有一个 3D 矩阵,例如:

array([[[3., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]],
       [[0., 0., 0.],
        [2., 0., 0.],
        [0., 0., 0.]],
       [[0., 0., 0.],
        [12., 0., 0.],
        [0., 0., 0.]]])

我想用 for 循环按顺序将其切成 [: , 0, :], [-1,: :].. 和所有 6 个方向。所以对于每个维度,从第一个 (0) 和最后一个 (-1) 开始切片。

应用 for 循环的正确方法是什么?

假设数组的名称是A

A[0, :, :]
A[:, :, 0]
A[:, 0, :]
A[-1, :, :]
A[:, -1, :]
A[:, :, -1]

我想在一个循环中包含这 6 个子矩阵(让我们说在一个列表中)。

【问题讨论】:

  • “所有 6 个方向”和“按顺序”是什么意思?如果您举一个您期望的输出示例可能会有所帮助。
  • NumPy 几乎不需要循环。最好的答案不太可能涉及循环。如果您显示您对输入的期望输出会有所帮助吗?
  • 这是一个 (3,3,3) 形状的数组。您需要更明确地说明您想要做什么 - 结果切片的示例。如果您使用像 np.arange(24).reshape(2,3,4) 这样的数组 - 不同的维度和值,则操作通常会更清晰。
  • 对问题进行了编辑,使其更加清晰。重塑不是一种选择。

标签: python arrays numpy indexing


【解决方案1】:

完全不清楚为什么你想这样做,但你可以使用take动态抓取子数组:

import numpy as np
arr = np.arange(2*3*4).reshape(2, 3, 4)  # dummy input

arrays = [arr.take(index, axis) for axis in range(arr.ndim) for index in [0,-1]]

此数组列表将按此顺序包含arr[0,:,:]arr[-1,:,:]arr[:,0,:]arr[:,-1,:] 等。以下是数组列表中单个元素的证明:

>>> np.array_equal(arr[:,-1,:], arr.take(-1, 1))
True

您的问题对顺序并不太具体,但上述内容可以很容易地概括为您的切片要求的任意顺序:

indices = [0, 0, 0, -1, -1, -1]
axes = [0, 2, 1, 0, 1, 2]
arrays = [arr.take(index, axis) for index,axis in zip(indices, axes)]

这与您问题中指定的子数组的顺序相匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多