Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过保留有关原始索引的信息,对nDarray上的最小值进行排序_Python_Numpy_Numpy Ndarray - Fatal编程技术网

Python 通过保留有关原始索引的信息,对nDarray上的最小值进行排序

Python 通过保留有关原始索引的信息,对nDarray上的最小值进行排序,python,numpy,numpy-ndarray,Python,Numpy,Numpy Ndarray,考虑将numpy.ndarrayD1与形状(10,N,M) 我想用shape(N*M,3)构建一个新的ndarray O1。以便: 每个元素都是一个三元组,用于标识D1上元素的索引 索引根据D1中相应字段的值进行排序 对于每个0≤我≤N,0≤J≤M仅考虑10个维度上的最小元素 让我们考虑一个小例子,用2代替10,当前的方法部分实现了我的目标: >>> d1 = np.random.randint(20, size=2*3*3).reshape(2,3,3) array([

考虑将
numpy.ndarray
D1与形状
(10,N,M)

我想用shape
(N*M,3)
构建一个新的ndarray O1。以便:

  • 每个元素都是一个三元组,用于标识D1上元素的索引
  • 索引根据D1中相应字段的值进行排序
  • 对于每个
    0≤我≤N
    0≤J≤M
    仅考虑10个维度上的最小元素

让我们考虑一个小例子,用2代替10,当前的方法部分实现了我的目标:

>>> d1 = np.random.randint(20, size=2*3*3).reshape(2,3,3)

array([[[ 2,  6, 18],
        [18, 18, 10],
        [ 2,  3,  1]],

        [[11,  3, 14],
        [12, 14, 18],
        [ 6,  8, 19]]])

>>> d2 = np.amin(d1, axis=0)

array([[ 2,  3, 14],
       [12, 14, 10],
       [ 2,  3,  1]])

>>> o1 = np.dstack(np.unravel_index(np.argsort(d2.ravel()), d2.shape))

array([[[2, 2],
        [0, 0],
        [2, 0],
        [0, 1],
        [2, 1],
        [1, 2],
        [1, 0],
        [0, 2],
        [1, 1]]])
通过这种方式,我得到了关于2维元素的最小索引,但是我失去了关于D1中初始索引的信息

在这种情况下,预期输出应为:

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

结构化数组是同时处理索引和最小值的简便方法:

M, N = d1.shape[1:]
mi, ni = np.ogrid[:M, :N]
data = np.empty((M, N), [('coords', np.intp, 3), ('min', d1.dtype)])
data['coords'][..., 0] = mi
data['coords'][..., 1] = ni
data['coords'][..., 2] = np.argmin(d1, axis=0)
data['min'] = np.min(d1, axis=0)

data = data.ravel()  # collapse (M, N) to (M*N,)
data_sorted = data[np.argsort(data['min'])]
o1 = data_sorted['coords']
但您也可以通过代码轻松实现:

d2 = np.min(d1, axis=0)
arg_d2 = np.argmin(d1, axis=0)
order = np.argsort(d2.ravel())
mi, ni = np.unravel_index(order, d2.shape)
o1 = np.stack((mi, ni, arg_d2.ravel()[order]), axis=-1)  # dstack but faster

结构化数组是同时处理索引和最小值的简便方法:

M, N = d1.shape[1:]
mi, ni = np.ogrid[:M, :N]
data = np.empty((M, N), [('coords', np.intp, 3), ('min', d1.dtype)])
data['coords'][..., 0] = mi
data['coords'][..., 1] = ni
data['coords'][..., 2] = np.argmin(d1, axis=0)
data['min'] = np.min(d1, axis=0)

data = data.ravel()  # collapse (M, N) to (M*N,)
data_sorted = data[np.argsort(data['min'])]
o1 = data_sorted['coords']
但您也可以通过代码轻松实现:

d2 = np.min(d1, axis=0)
arg_d2 = np.argmin(d1, axis=0)
order = np.argsort(d2.ravel())
mi, ni = np.unravel_index(order, d2.shape)
o1 = np.stack((mi, ni, arg_d2.ravel()[order]), axis=-1)  # dstack but faster

谢谢你的回答。然而,在第二种方法中,
arg\u d2[order]
似乎会导致一个
索引器
@abc:Fixed,我想谢谢你的回答。然而,在第二种方法中,
arg\u d2[order]
似乎会导致
索引器
@abc:Fixed,我认为