Python 重新组织三维numpy阵列

Python 重新组织三维numpy阵列,python,numpy,matplotlib,Python,Numpy,Matplotlib,我试了几天,找了几天,我走近了,但需要你的帮助 我有一个python的3d数组 shape(files) >> (31,2049,2) 它对应于31个输入文件,包含2列2048行和一个标题的数据 我想根据每个文件中的头对这个数组进行排序,头是一个数字 我试着跟着,但我非常困惑 首先,我尝试设置获取argsort的标题,我想我可以这样做 sortval=files[:][0][0] 但这是行不通的 然后我简单地做了一个for循环来迭代并获取我的标题 for i in xrange(

我试了几天,找了几天,我走近了,但需要你的帮助

我有一个python的3d数组

shape(files)
>> (31,2049,2)
它对应于31个输入文件,包含2列2048行和一个标题的数据

我想根据每个文件中的头对这个数组进行排序,头是一个数字

我试着跟着,但我非常困惑

首先,我尝试设置获取argsort的标题,我想我可以这样做

sortval=files[:][0][0]
但这是行不通的

然后我简单地做了一个for循环来迭代并获取我的标题

for i in xrange(shape(files)[0]:
    sortval.append([i][0][0])
然后

这是可行的,但是我不明白最后一行发生了什么

files = files[np.arange(len(deck))[:,np.newaxis],sortedIdx]

非常感谢您的帮助。

这里我们可以使用一个简单的示例来演示您的代码所做的工作:

首先,我们创建一个随机3D numpy矩阵:

a = (np.random.rand(3,3,2)*10).astype(int)
array([[[3, 1],
        [3, 7],
        [0, 3]],
       [[2, 9],
        [1, 0],
        [9, 2]],
       [[9, 2],
        [8, 8],
        [8, 0]]])
然后,[:]将给出a本身,[:][0][0]只是a中第一个2D数组中的第一行,即:

a[:][0]
# array([[3, 1],
#        [3, 7],
#        [0, 3]])

a[:][0][0]
# array([3, 1])
在本例中,您需要的是标题3,2,9,因此我们可以使用[:,0,0]来提取它们:

a[:,0,0]
# array([3, 2, 9])
现在,我们对上面的列表进行排序,并获得一个索引数组:

np.argsort(a[:,0,0])
# array([1, 0, 2])
np.arange(len(a))[:,np.newaxis]
# array([[0],
#        [1],
#        [2]])
为了重新排列整个3D阵列,我们需要以正确的顺序切片阵列。np.arangelena[:,np.newaxis]等于np.arangelena.Reforme-1,1,它创建了一个连续的二维索引数组:

np.argsort(a[:,0,0])
# array([1, 0, 2])
np.arange(len(a))[:,np.newaxis]
# array([[0],
#        [1],
#        [2]])
如果没有二维数组,我们将把数组切片为二维

a[np.arange(3), np.argsort(a[:,0,0])]
# array([[3, 7],
#        [2, 9],
#        [8, 0]])
使用2D阵列,我们可以执行3D切片并保持形状:

a[np.arange(3).reshape(-1,1), np.argsort(a[:,0,0])]
array([[[3, 7],
        [3, 1],
        [0, 3]],
       [[1, 0],
        [2, 9],
        [9, 2]],
       [[8, 8],
        [9, 2],
        [8, 0]]])
以上是您想要的最终结果

编辑:

要排列2D数组:,可以使用:

a[np.argsort(a[:,0,0])]
array([[[2, 9],
        [1, 0],
        [9, 2]],
       [[3, 1],
        [3, 7],
        [0, 3]],
       [[9, 2],
        [8, 8],
        [8, 0]]])

另一种方法是使用np.take


亲爱的凯文,谢谢你的回复。但是,我不想更改单个子阵列,只想在3D阵列中重新排列它们。e、 g.在您的示例中,以[[2,9],[3,1],[9,2],]结束。我可以改写这个问题来澄清。@LearningPython那么[np.argsorta[:,0,0]]就可以做到这一点。