首页 > 解决方案 > 从 3D 数组中查找每个 2D 数组中最小值的索引

问题描述

一般来说,我是 numpy 和 python 的新手,我希望找到每个 2D 子数组的最小值,给定一个 3D 数组。例如:

# construct an example 3D array
a = np.array([[5,4,1,5], [0,1,2,3], [3,2,8,1]]).astype(np.float32)
b = np.array([[3,2,9,3], [8,6,5,3], [6,7,2,8]]).astype(np.float32)
c = np.array([[9,7,6,5], [4,7,6,3], [1,2,3,4]]).astype(np.float32)
d = np.array([[5,4,9,2], [4,2,6,1], [7,5,9,1]]).astype(np.float32)
e = np.array([[4,5,2,9], [7,1,5,8], [0,2,6,4]]).astype(np.float32)

a = np.insert(a, 0, [np.inf]*len(a), axis=1)
b = np.insert(b, 1, [np.inf]*len(b), axis=1)
c = np.insert(c, 2, [np.inf]*len(c), axis=1)
d = np.insert(d, 3, [np.inf]*len(d), axis=1)
e = np.insert(e, 4, [np.inf]*len(e), axis=1)

arr = np.swapaxes(np.dstack((a,b,c,d,e)), 1, 2)
print(arr) 

给出这个结果: 3D 矩阵

我正在寻找的结果是每个二维数组中最小元素的索引,例如:

[[0, 0, 3], # corresponding to the coordinates of element with value 1 in the first 2D array
 [1, 0, 1], # corresponding to the coordinates of element with value 0 in the second 2D array
 [2, 4, 0]] # corresponding to the coordinates of element with value 0 in the third 2D array

或类似的东西。我计划使用索引来获取该值,然后用无限值替换该二维子数组中的列和行,以找到不在同一行/列中的下一个最小值。

任何帮助表示赞赏,谢谢!

标签: pythonarraysnumpymultidimensional-arraysub-array

解决方案


In [716]: arr
Out[716]: 
array([[[inf,  5.,  4.,  1.,  5.],
        [ 3., inf,  2.,  9.,  3.],
        [ 9.,  7., inf,  6.,  5.],
        [ 5.,  4.,  9., inf,  2.],
        [ 4.,  5.,  2.,  9., inf]],

       [[inf,  0.,  1.,  2.,  3.],
        [ 8., inf,  6.,  5.,  3.],
        [ 4.,  7., inf,  6.,  3.],
        [ 4.,  2.,  6., inf,  1.],
        [ 7.,  1.,  5.,  8., inf]],

       [[inf,  3.,  2.,  8.,  1.],
        [ 6., inf,  7.,  2.,  8.],
        [ 1.,  2., inf,  3.,  4.],
        [ 7.,  5.,  9., inf,  1.],
        [ 0.,  2.,  6.,  4., inf]]], dtype=float32)

将其重塑为 2d:

In [717]: idx = np.argmin(arr.reshape(3,-1),1)
In [718]: idx
Out[718]: array([ 3,  1, 20])

将这些索引转换为 2d:

In [719]: np.unravel_index(idx,(5,5))
Out[719]: (array([0, 0, 4]), array([3, 1, 0]))

然后可以进一步处理以获得您想要的值 - 转置并添加 [0,1,2]

In [720]: np.transpose(np.vstack((np.arange(3),_)))
Out[720]: 
array([[0, 0, 3],
       [1, 0, 1],
       [2, 4, 0]])

推荐阅读