首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >排序4D numpy数组但保持一个轴连接在一起

排序4D numpy数组但保持一个轴连接在一起
EN

Stack Overflow用户
提问于 2018-10-23 15:46:05
回答 1查看 321关注 0票数 1

首先,我研究了NumPy: sorting 3D array but keeping 2nd dimension assigned to first问题,但公认的答案并不完全适合我的问题,因为我需要uint16中可能的全部值,并且不希望使用int32来避免使用过多的内存。

我的问题是,我有一个3D数组的堆栈(每个图像有两个波段),我希望沿着堆栈的轴进行排序(根据第一个波段的值),但是通过将每个图像的两个带保存在一起……我希望这是比较清楚的。

生成类似于我所拥有的数组的代码:

代码语言:javascript
运行
复制
import numpy as np 
# Here a stack of three 3x2 images containing two bands each
arr = np.zeros((3,3,2,2), 'uint16')

np.random.seed(5)
arr[0,:,:,0] = np.random.randint(10, 90, 6).reshape(3,2)
arr[0,:,:,1] = 51
arr[1,:,:,0] = np.random.randint(10, 90, 6).reshape(3,2)
arr[1,:,:,1] = 52
arr[2,:,:,0] = np.random.randint(10, 90, 6).reshape(3,2)
arr[2,:,:,1] = 50
arr[np.where(arr >= 85)] = 99 #just to have couple identical values like my dataset has

>>> arr
array([[[[99, 51],
         [71, 51]],

        [[26, 51],
         [83, 51]],

        [[18, 51],
         [72, 51]]],


       [[[37, 52],
         [40, 52]],

        [[17, 52],
         [99, 52]],

        [[25, 52],
         [63, 52]]],


       [[[37, 50],
         [54, 50]],

        [[99, 50],
         [99, 50]],

        [[75, 50],
         [57, 50]]]], dtype=uint16)

由于我希望对堆栈进行排序,我使用了arr_sorted = np.sort(arr, axis=0),但这破坏了每个光栅的两个波段之间的链接:

代码语言:javascript
运行
复制
>>> arr[0,2,1,:]
array([72, 51], dtype=uint16)

>>> arr_sorted[2,2,1,:]
array([72, 52], dtype=uint16) #value 72 is no longer tied to 51 but to 52

我可以使用idx = np.argsort(arr[:,:,:,0], axis=0)来获取我想要的排序索引,但是我没有找到如何使用idx来对arr[:,:,:,0]arr[:,:,:,1]进行排序。那可能很容易对吧!

实际上,我希望能够在uint16中对一个由50x11000 x 11000 x2组成的数组进行排序,这样它就需要尽可能地提高内存效率。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-23 16:58:16

使用新的take_along_axis

代码语言:javascript
运行
复制
In [351]: arr = np.random.randint(0,10,(3,3,2,2))
In [352]: idx = np.argsort(arr[...,0], axis=0)
In [353]: idx.shape
Out[353]: (3, 3, 2)
In [354]: arr1 = np.take_along_axis(arr, idx[...,None], axis=0)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52953076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档