2

假设我有两个数组,例如:

a = array([ 0.36981727,  0.06066488,  0.73031016])

b = array([[ 0.12375904,  0.11647815,  0.56665118],
       [ 0.9421819 ,  0.58797789,  0.26831203],
       [ 0.25769   ,  0.02517343,  0.76701222]])

其中 的每个元素a对应于 b 的一个数组。b现在为了对“a”进行排序并在我做的过程中跟踪其对应的向量:

ziped_and_sorted = np.array(sorted(zip(a,b), key=operation.itemgetter(0), reverese =True),'object')

然后我需要再次拆分 a 和 b,所以:

a = ziped_and_sorted[:,0]

In [158]: a
Out[158]: array([0.369817272838, 0.0606648844006, 0.730310164248], dtype=object)

b = ziped_and_sorted[:,1]

In [157]: b
Out[157]:
array([[ 0.12375904  0.11647815  0.56665118],
       [ 0.9421819   0.58797789  0.26831203],
       [ 0.25769     0.02517343  0.76701222]], dtype=object)

问题是b.shape返回 (3,)而不是(3,3). 这很重要,因为我需要进行矩阵乘法b并且问题会导致dimension mismatched错误。

PS:如果您有更好的解决方案,请提出建议。

4

1 回答 1

3

这是因为 b 是 ndarray 的 ndarray,但不是 2-dim ndarray。

您可以使用它numpy.argsort来快速执行此操作:

import numpy as np
a = np.random.randint(0, 100, 5)
b = np.random.randint(0, 5, (5, 5))
print a
print b
idx = np.argsort(a)[::-1]
print a[idx]
print b[idx]

输出是:

[27 65  8 19 32]

[[4 4 1 4 4]
 [1 3 4 3 3]
 [3 4 2 1 0]
 [1 0 1 0 4]
 [1 4 1 1 4]]

[65 32 27 19  8]

[[1 3 4 3 3]
 [1 4 1 1 4]
 [4 4 1 4 4]
 [1 0 1 0 4]
 [3 4 2 1 0]]

如果要使用sorted,可以使用numpy.vstack将数组列表转换为 2-dim ndarray:

ziped_and_sorted = sorted(zip(a,b), key=operator.itemgetter(0), reverse=True)
np.vstack([row[1] for row in ziped_and_sorted])
于 2013-05-16T22:15:21.803 回答