为了账号安全,请及时绑定邮箱和手机立即绑定

重组 3d numpy 数组

重组 3d numpy 数组

慕斯王 2021-08-24 18:22:21
我已经尝试并搜索了几天,我已经接近但需要您的帮助。我在 python 中有一个 3d 数组,shape(files) >> (31,2049,2)它对应于 31 个输入文件,其中包含 2 列数据、2048 行和一个标题。我想根据每个文件中的标题(一个数字)对这个数组进行排序。我试图遵循NumPy:sorting 3D array but保持 2nd dimension分配给 first,但我非常困惑。首先,我尝试为 argsort 设置获取我的标头,我想我可以做到sortval=files[:][0][0]但这不起作用..然后我只是做了一个 for 循环来迭代并获取我的标题for i in xrange(shape(files)[0]:     sortval.append([i][0][0])然后sortedIdx = np.argsort(sortval)这有效,但是我不明白最后一行发生了什么..files = files[np.arange(len(deck))[:,np.newaxis],sortedIdx]帮助将不胜感激。
查看完整描述

2 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

这里我们可以用一个简单的例子来演示你的代码在做什么:


首先我们创建一个随机的 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[:]将给出a自己,并且a[:][0][0]只是第一个二维数组中的第一行a,即:


a[:][0]

# array([[3, 1],

#        [3, 7],

#        [0, 3]])


a[:][0][0]

# array([3, 1])

你想要的是3,2,9这个例子中的标题,所以我们可以a[:, 0, 0]用来提取它们:


a[:,0,0]

# array([3, 2, 9])

现在我们对上面的列表进行排序并得到一个索引数组:


np.argsort(a[:,0,0])

# array([1, 0, 2])

为了重新排列整个 3D 数组,我们需要以正确的顺序对数组进行切片。并且np.arange(len(a))[:,np.newaxis]等于np.arange(len(a)).reshape(-1,1)创建一个连续的二维索引数组:


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]]])

以上就是你想要的最终结果。


编辑:


要排列二维数组:,可以使用:


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]]])


查看完整回答
反对 回复 2021-08-24
?
月关宝盒

TA贡献1772条经验 获得超5个赞

另一种方法是使用 np.take

header = a[:,0,0]
sorted = np.take(a, np.argsort(header), axis=0)


查看完整回答
反对 回复 2021-08-24
  • 2 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信