如何从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)
我有一个 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)