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]]])
TA贡献1772条经验 获得超5个赞
另一种方法是使用 np.take
header = a[:,0,0] sorted = np.take(a, np.argsort(header), axis=0)
添加回答
举报