26
类似于this answer,我有一双3D numpy的阵列,a
和b
的,我要通过的a
值来的b
的条目进行排序。与this answer不同,我只想沿阵列的一个轴进行排序。排序由另一个阵列的numpy的阵列,沿特定轴
我的numpy.argsort()
文件的天真阅读:
Returns
-------
index_array : ndarray, int
Array of indices that sort `a` along the specified axis.
In other words, ``a[index_array]`` yields a sorted `a`.
使我相信,我可以做我的排序与下面的代码:
import numpy
a = numpy.zeros((3, 3, 3))
a += numpy.array((1, 3, 2)).reshape((3, 1, 1))
print "a"
print a
"""
[[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]
[[ 3. 3. 3.]
[ 3. 3. 3.]
[ 3. 3. 3.]]
[[ 2. 2. 2.]
[ 2. 2. 2.]
[ 2. 2. 2.]]]
"""
b = numpy.arange(3*3*3).reshape((3, 3, 3))
print "b"
print b
"""
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]
[[18 19 20]
[21 22 23]
[24 25 26]]]
"""
print "a, sorted"
print numpy.sort(a, axis=0)
"""
[[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]
[[ 2. 2. 2.]
[ 2. 2. 2.]
[ 2. 2. 2.]]
[[ 3. 3. 3.]
[ 3. 3. 3.]
[ 3. 3. 3.]]]
"""
##This isnt' working how I'd like
sort_indices = numpy.argsort(a, axis=0)
c = b[sort_indices]
"""
Desired output:
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
[[18 19 20]
[21 22 23]
[24 25 26]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]]
"""
print "Desired shape of b[sort_indices]: (3, 3, 3)."
print "Actual shape of b[sort_indices]:"
print c.shape
"""
(3, 3, 3, 3, 3)
"""
什么是应该做的正确方法?
非常好,谢谢! – Andrew 2011-05-28 14:01:46
我喜欢这个回答。为了节省一些内存,可以将'static_indices'改为'static_indices = np.ogrid [0:a.shape [1],0:a.shape [2]]'。这将产生更小的数组,但是会通过利用广播与'np.indices'做同样的事情。它可以像这样使用:'b [sort_indices,static_indices [1],static_indices [2]]'。 – unutbu 2011-05-28 16:26:20
Err,'b [sort_indices,static_indices [0],static_indices [1]]'而不是。 – unutbu 2011-05-28 17:01:13