2

私は2つの派手な配列を持っています。1つはN×M、もう1つはN×1です。最初のリストをM次元のいずれかでソートできるようにしたいのですが、リストを同じ順序に保ちたいです(つまり、行1と15を交換した場合) list1 の場合、list2 の 1 行目と 15 行目も入れ替えます。)

例えば:

import numpy as np
a = np.array([[1,6],[3,4],[2,5]])
b = np.array([[.5],[.8],[.2]])

次に、たとえば、各行の最初の要素で並べ替えて、次のようにしたいと思いaます。

a = [[1,6],[2,5],[3,4]]
b = [[.5],[.2],[.8]]

または、たとえば、各行の 2 番目の要素で並べ替えて、次のように指定aします。

a = [[3,4],[2,5],[1,6]]
b = [[.8],[.2],[.5]

この質問のように、両方のリストが一次元である同様の問題がたくさんあります。または、リストのリストの並べ替えに関する質問、たとえばthis one。しかし、探しているものが見つかりません。

最終的に私はこれを機能させました:

import numpy as np
a = np.array([[1,6],[3,4],[2,5]])
b = np.array([[.5],[.8],[.2]])
package = zip(a,b)
print package[0][1]
sortedpackage= sorted(package, key=lambda dim: dim[0][1])
d,e = zip(*sortedpackage)
print d
print e

これで、必要に応じて d と e が生成されます。

  d = [[3,4],[2,5],[1,6]]
  e = [[.8],[.2],[.5]

しかし、理由がわかりません。は print package[0][1]0.5 を与えます - これは私がソートしている要素ではありません。どうしてこれなの?私がやっていることは堅牢ですか?

4

3 に答える 3

2

複数の numpy 配列に同じ並べ替え順序を適用するには、 を使用できますnp.argsort()。たとえば、2 番目の列で並べ替えるには、次のようにします。

indices = a[:,1].argsort()
print(a[indices])
print(b[indices])

出力:

[[3 4]
 [2 5]
 [1 6]]

[[ 0.8]
 [ 0.2]
 [ 0.5]]
于 2013-03-16T06:25:39.263 に答える
2

The reason print package[0][1] returns 0.5 is because it is accessing the numbers in your list of tuples "as a whole" whereas sorted is looking at each individual element of the given iterable.

You zip a and b in package:

[([1, 6], [0.5]),
 ([3, 4], [0.8]),
 ([2, 5], [0.2])]

It is at this point that you print package[0][1]. The first element is obtained with package[0] = ([1, 6], [0.5]). The next index [1] gives you the second element of the first tuple, thus you get 0.5.

Considering sorted, the function is examining the elements of the iterable, individually. It may first look at ([1, 6], [0.5]), then ([3, 4], [0.8]), and so on.

So when you specify a key with a lambda function you are really saying, for this particular element of the iterable, get the value at [0][1]. That is, sort by the second value of of the first element of the given tuple (the second value of a).

于 2013-03-16T06:27:01.350 に答える
1

あなたの中にpackage

package[0](a[0], b[0]) したがって、はpackage[0][1]b[0]です。

あなたのパッケージは三重にネストされています。は、ソートのキーとしてkey=lambda dim : dim[0][1]使用することを意味します。で構成され、二重にネストされています。item[0][1]packagepackageitemitem

ソートしている要素を確認するにはpackage[x][0][1]、そのアイテムのインデックスである xを使用します

于 2013-03-16T06:26:13.307 に答える