Python 如何在numpy中查找3d数组中的最小值和最大值,并对结果进行分组?

Python 如何在numpy中查找3d数组中的最小值和最大值,并对结果进行分组?,python,arrays,numpy,numpy-ndarray,Python,Arrays,Numpy,Numpy Ndarray,我有一个3D NumPy阵列,如下所示: [[[4 1 5 2 5 5 7 8 9 7] [7 4 2 4 7 8 4 1 3 5] [6 1 2 1 1 1 2 3 7 6] [5 5 5 0 5 4 3 8 7 1] [2 8 6 7 4 7 5 5 5 1]] [[9 9 5 8 0 7 3 9 8 1] [9 1 9 5 7 4 5 4 7 0] [1 0 4 8 7 3 4 3 8 8] [8 1 3 1 7 0 9 9 3 8] [4 0 2 3

我有一个3D NumPy阵列,如下所示:

[[[4 1 5 2 5 5 7 8 9 7]
  [7 4 2 4 7 8 4 1 3 5]
  [6 1 2 1 1 1 2 3 7 6]
  [5 5 5 0 5 4 3 8 7 1]
  [2 8 6 7 4 7 5 5 5 1]]

 [[9 9 5 8 0 7 3 9 8 1]
  [9 1 9 5 7 4 5 4 7 0]
  [1 0 4 8 7 3 4 3 8 8]
  [8 1 3 1 7 0 9 9 3 8]
  [4 0 2 3 8 2 0 1 2 4]]

 [[1 6 2 4 4 0 2 3 0 3]
  [9 6 8 6 6 5 6 9 4 1]
  [0 4 0 2 9 1 1 2 4 6]
  [6 1 9 9 7 8 9 7 6 8]
  [9 3 9 0 7 0 0 0 7 0]]]
[[6]
 [9]
 [9]]
有了它,我想创建一个2d ndarray,如下所示:

[[[4 1 5 2 5 5 7 8 9 7]
  [7 4 2 4 7 8 4 1 3 5]
  [6 1 2 1 1 1 2 3 7 6]
  [5 5 5 0 5 4 3 8 7 1]
  [2 8 6 7 4 7 5 5 5 1]]

 [[9 9 5 8 0 7 3 9 8 1]
  [9 1 9 5 7 4 5 4 7 0]
  [1 0 4 8 7 3 4 3 8 8]
  [8 1 3 1 7 0 9 9 3 8]
  [4 0 2 3 8 2 0 1 2 4]]

 [[1 6 2 4 4 0 2 3 0 3]
  [9 6 8 6 6 5 6 9 4 1]
  [0 4 0 2 9 1 1 2 4 6]
  [6 1 9 9 7 8 9 7 6 8]
  [9 3 9 0 7 0 0 0 7 0]]]
[[6]
 [9]
 [9]]
其中,此二维数组的每个元素都是原始数组第三列的最大值:

a[:,:,2].max(1, keepdims=True)
我已经花了几个小时试图解决这个问题,但没有运气

我要求一个2d数组作为输出,因为我还有其他的计算要做,比如说,我还需要以类似的方式最小化第二列的值,但我想我可以从中推断出来

非常感谢您的指点

您是否尝试过以下方法:

import numpy as np
x = np.random.randint(0, 10, (3, 5, 10))
print(x)
maxes = x[:,:,2].max(axis=1)
print(maxes)

[[[5 0 6 6 4 7 5 0 4 8]
  [0 6 8 8 2 1 7 5 4 3]
  [2 7 5 5 0 2 6 8 6 3]
  [5 9 7 5 1 1 5 4 8 7]
  [0 2 3 7 8 1 9 1 2 6]]

 [[8 9 4 3 3 6 0 4 9 1]
  [1 5 6 4 3 2 7 7 0 2]
  [3 2 0 1 9 6 5 8 0 5]
  [6 1 5 9 1 6 4 7 4 5]
  [7 2 5 8 6 8 5 1 9 5]]

 [[9 4 0 9 0 6 3 7 4 1]
  [4 1 4 9 1 1 1 2 0 6]
  [7 3 3 2 5 2 0 6 9 1]
  [1 7 0 1 8 1 3 8 6 4]
  [6 9 0 2 6 0 2 1 7 7]]]
[8 6 4]
要了解这是如何工作的,请执行以下操作:

并且,要获得所有列的最大值:

col_maximums = x.max(axis=1)
print(col_maximums)
                                                                                    
[[5 9 8 8 8 7 9 8 8 8]
 [8 9 6 9 9 8 7 8 9 5]
 [9 9 4 9 8 6 3 8 9 7]]
你试过这个吗:

import numpy as np
x = np.random.randint(0, 10, (3, 5, 10))
print(x)
maxes = x[:,:,2].max(axis=1)
print(maxes)

[[[5 0 6 6 4 7 5 0 4 8]
  [0 6 8 8 2 1 7 5 4 3]
  [2 7 5 5 0 2 6 8 6 3]
  [5 9 7 5 1 1 5 4 8 7]
  [0 2 3 7 8 1 9 1 2 6]]

 [[8 9 4 3 3 6 0 4 9 1]
  [1 5 6 4 3 2 7 7 0 2]
  [3 2 0 1 9 6 5 8 0 5]
  [6 1 5 9 1 6 4 7 4 5]
  [7 2 5 8 6 8 5 1 9 5]]

 [[9 4 0 9 0 6 3 7 4 1]
  [4 1 4 9 1 1 1 2 0 6]
  [7 3 3 2 5 2 0 6 9 1]
  [1 7 0 1 8 1 3 8 6 4]
  [6 9 0 2 6 0 2 1 7 7]]]
[8 6 4]
要了解这是如何工作的,请执行以下操作:

并且,要获得所有列的最大值:

col_maximums = x.max(axis=1)
print(col_maximums)
                                                                                    
[[5 9 8 8 8 7 9 8 8 8]
 [8 9 6 9 9 8 7 8 9 5]
 [9 9 4 9 8 6 3 8 9 7]]

您需要做的是获取您想要的列。在这种情况下,它是arr[:,:,2]。这将具有3,5的形状。arr=np.maxarr[:,:,2],axis=-1然后生成所需形状为3的数组内容。然后,您可以调用arr=np.reformarr,3,1以获得所需的形状。

您需要做的是获取所需的列。在这种情况下,它是arr[:,:,2]。这将具有3,5的形状。arr=np.maxarr[:,:,2],axis=-1然后生成所需形状为3的数组内容。然后,您可以调用arr=np.reformarr,3,1以获得所需的形状。

下面我尝试一步一步地执行该操作,并在每次操作后打印该形状。 2是很重要的,以便保留尺寸并像您希望的那样保持二维,否则它会自动折叠单体尺寸

import numpy as np

a = np.array([
    [[4, 1, 5, 2, 5, 5, 7, 8, 9, 7],
     [7, 4, 2, 4, 7, 8, 4, 1, 3, 5],
     [6, 1, 2, 1, 1, 1, 2, 3, 7, 6],
     [5, 5, 5, 0, 5, 4, 3, 8, 7, 1],
     [2, 8, 6, 7, 4, 7, 5, 5, 5, 1]],

    [[9, 9, 5, 8, 0, 7, 3, 9, 8, 1],
     [9, 1, 9, 5, 7, 4, 5, 4, 7, 0],
     [1, 0, 4, 8, 7, 3, 4, 3, 8, 8],
     [8, 1, 3, 1, 7, 0, 9, 9, 3, 8],
     [4, 0, 2, 3, 8, 2, 0, 1, 2, 4]],

    [[1, 6, 2, 4, 4, 0, 2, 3, 0, 3],
     [9, 6, 8, 6, 6, 5, 6, 9, 4, 1],
     [0, 4, 0, 2, 9, 1, 1, 2, 4, 6],
     [6, 1, 9, 9, 7, 8, 9, 7, 6, 8],
     [9, 3, 9, 0, 7, 0, 0, 0, 7, 0]]
])

print(a.shape)  # --> (3, 5, 10)
col2 = a[:, :, (2,)]
print(col2.shape)  # --> (3, 5, 1)
max_col2 = col2.max(axis=1)
print(max_col2.shape)  # --> (3, 1)
print(max_col2)  # -->

[[6]
 [9]
 [9]]
 

下面我试着一步一步地做这个操作,每次操作后都打印出形状。 2是很重要的,以便保留尺寸并像您希望的那样保持二维,否则它会自动折叠单体尺寸

import numpy as np

a = np.array([
    [[4, 1, 5, 2, 5, 5, 7, 8, 9, 7],
     [7, 4, 2, 4, 7, 8, 4, 1, 3, 5],
     [6, 1, 2, 1, 1, 1, 2, 3, 7, 6],
     [5, 5, 5, 0, 5, 4, 3, 8, 7, 1],
     [2, 8, 6, 7, 4, 7, 5, 5, 5, 1]],

    [[9, 9, 5, 8, 0, 7, 3, 9, 8, 1],
     [9, 1, 9, 5, 7, 4, 5, 4, 7, 0],
     [1, 0, 4, 8, 7, 3, 4, 3, 8, 8],
     [8, 1, 3, 1, 7, 0, 9, 9, 3, 8],
     [4, 0, 2, 3, 8, 2, 0, 1, 2, 4]],

    [[1, 6, 2, 4, 4, 0, 2, 3, 0, 3],
     [9, 6, 8, 6, 6, 5, 6, 9, 4, 1],
     [0, 4, 0, 2, 9, 1, 1, 2, 4, 6],
     [6, 1, 9, 9, 7, 8, 9, 7, 6, 8],
     [9, 3, 9, 0, 7, 0, 0, 0, 7, 0]]
])

print(a.shape)  # --> (3, 5, 10)
col2 = a[:, :, (2,)]
print(col2.shape)  # --> (3, 5, 1)
max_col2 = col2.max(axis=1)
print(max_col2.shape)  # --> (3, 1)
print(max_col2)  # -->

[[6]
 [9]
 [9]]
 

您也可以使用np.max的keepdims参数,如下所示:a是原始数组:

a[:,:,2].max(1, keepdims=True)
输出:

[[6]
 [9]
 [9]]

您也可以使用np.max的keepdims参数,如下所示:a是原始数组:

a[:,:,2].max(1, keepdims=True)
输出:

[[6]
 [9]
 [9]]

切片所需列,沿适当的剩余轴取最大值切片所需列,沿适当的剩余轴取最大值