如何从Python中的多维数组中获取一个二维数组?

How to get one 2D array from multidimensional array in Python?

我有一个 Python ndarray,它是布尔值,形状如下:(32, 1600, 1600)。从 1 到 32,每一层(我将 1600x1600 可视化为一层,将 32 可视化为 32 层)具有不同数量的 True,并且 True 可能位于其各自 2D 层中的不同索引处。我想将这个从 32 到 1“展平”(不知道这是不是正确的术语),这样得到的数组是 (1600, 1600),每个 True 都转移到结果中的相应位置。这是我的起始多维数组的一个非常简化的示例。该数组是布尔值,True/False,但在此示例中我使用 0 表示 False,1 表示 True:

array([[[0, 0, 0, 0, 0],
        [0, 1, 0, 1, 0], #two "Trues"
        [0, 1, 0, 1, 0], #two "Trues"
        [0, 1, 0, 0, 0], #one "True"
        [0, 0, 0, 0, 0]],

       [[0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0],
        [0, 1, 0, 1, 0], #two "Trues"
        [0, 1, 0, 1, 0], #two "Trues"
        [0, 0, 0, 0, 0]]])

我希望最终数组看起来像这样。每个 True 位置都被转移到新数组中的相应位置。因为它是布尔值,所以它不应该是累积的。

array([[[0, 0, 0, 0, 0],
        [0, 1, 0, 1, 0], #two "Trues"
        [0, 1, 0, 1, 0], #two "Trues"
        [0, 1, 0, 1, 0], #two "Trues"
        [0, 0, 0, 0, 0]]])

既然你有一个布尔数组,让我们创建一个。

a = np.array([[[0, 0, 0, 0, 0],
        [0, 1, 0, 1, 0],
        [0, 1, 0, 1, 0],
        [0, 1, 0, 0, 0],
        [0, 0, 0, 0, 0]],

       [[0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0],
        [0, 1, 0, 1, 0],
        [0, 1, 0, 1, 0],
        [0, 0, 0, 0, 0]]], dtype=bool)

您想沿第一个轴执行 or 操作。为此,您可以简单地沿第零轴求和,并找出元素是否大于零。

a.sum(axis=0) > 0

给出:

array([[False, False, False, False, False],
       [False,  True, False,  True, False],
       [False,  True, False,  True, False],
       [False,  True, False,  True, False],
       [False, False, False, False, False]])

要将其转换为整数数组,只需将其乘以 1:

1 * (a.sum(axis=0) > 0)

给出:

array([[0, 0, 0, 0, 0],
       [0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0],
       [0, 0, 0, 0, 0]])

我相信这就是您要找的东西,而且我认为按照您的描述将其转换回 True / False 应该很容易。如果您需要任何帮助,请评论。

arr = [[[0, 0, 0, 0, 0],
        [0, 1, 0, 1, 0],
        [0, 1, 0, 1, 0],
        [0, 1, 0, 0, 0],
        [0, 0, 0, 0, 0]],

       [[0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0],
        [0, 1, 0, 1, 0],
        [0, 1, 0, 1, 0],
        [0, 0, 0, 0, 0]]]

new_arr = [ [ 1 if arr[0][i][j] == 1 or arr[1][i][j] == 1 else 0 for j in range(len(arr[0][0])) ] for i in range(len(arr[0])) ]

print(new_arr)

输出:

[[0, 0, 0, 0, 0],
 [0, 1, 0, 1, 0],
 [0, 1, 0, 1, 0],
 [0, 1, 0, 1, 0],
 [0, 0, 0, 0, 0]]

你可以试试这个:

import numpy as np

arr = np.array([[[0, 0, 0, 0, 0],
        [0, 1, 0, 1, 0],
        [0, 1, 0, 1, 0],
        [0, 1, 0, 0, 0],
        [0, 0, 0, 0, 0]],

       [[0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0],
        [0, 1, 0, 1, 0],
        [0, 1, 0, 1, 0],
        [0, 0, 0, 0, 0]]], dtype=bool)

result = 1*np.logical_or.reduce(arr, axis=0)