1

2 つの配列を同時に並べ替える必要があります。または、配列の 1 つを並べ替えて、関連付けられた配列の対応する要素を並べ替える必要があります。つまり、配列が [(5, 33), (4, 44), (3, 55)] で、最初の軸 (dtype='alpha' の下にラベルが付けられています) で並べ替えた場合、次のようになります: [(3.0, 55.0 ) (4.0, 44.0) (5.0, 33.0)]。これらは非常に大きなデータ セットであり、他の操作を行う前に (nlog(n) 速度のために) 最初に並べ替える必要があります。ソートアルゴリズムを機能させるための適切な方法で、2つの別々の配列をマージする方法がわかりません。私の問題はかなり単純だと思います。私は3つの異なる方法を試しました:

import numpy
x=numpy.asarray([5,4,3])
y=numpy.asarray([33,44,55])

dtype=[('alpha',float), ('beta',float)]

values=numpy.array([(x),(y)])
values=numpy.rollaxis(values,1)
#values = numpy.array(values, dtype=dtype)
#a=numpy.array(values,dtype=dtype)
#q=numpy.sort(a,order='alpha')
print "Try 1:\n", values

values=numpy.empty((len(x),2))
for n in range (len(x)):
        values[n][0]=y[n]
        values[n][1]=x[n]
print "Try 2:\n", values
#values = numpy.array(values, dtype=dtype)
#a=numpy.array(values,dtype=dtype)
#q=numpy.sort(a,order='alpha')

###
values = [(x[0], y[0]), (x[1],y[1]) , (x[2],y[2])]
print "Try 3:\n", values
values = numpy.array(values, dtype=dtype)
a=numpy.array(values,dtype=dtype)
q=numpy.sort(a,order='alpha')

print "Result:\n",q

エラーが発生するため、1 回目と 2 回目の試行をコメントアウトしました。3 回目の試行は、RTFM で見たものを反映していたため、機能することはわかっていました。配列 x と y (非常に大きく、例のみを示します) が与えられた場合、numpy.sort で適切に呼び出すことができる配列 (値と呼ばれる) を構築するにはどうすればよいですか?

*** Zip はうまく機能します。ありがとうございます。おまけの質問: 並べ替えられたデータを後で 2 つの配列に再度解凍するにはどうすればよいですか?

4

6 に答える 6

6

あなたが欲しいのはzip機能だと思います。あなたが持っている場合

x = [1,2,3]
y = [4,5,6]

それからzip(x,y) == [(1,4),(2,5),(3,6)]

したがって、配列は次を使用して構築できます

a = numpy.array(zip(x,y), dtype=dtype)
于 2009-02-18T10:19:56.290 に答える
3

zip() 大規模なアレイでは非効率になる可能性があります。numpy.dstack()の代わりに使用できますzip

ndx = numpy.argsort(x)
values = numpy.dstack((x[ndx], y[ndx]))
于 2010-04-10T07:44:08.143 に答える
3

Simon は、代替アプローチとしてargsortを提案しました。方法としてお勧めします。厄介なマージ、圧縮、または解凍は不要です。インデックスでアクセスするだけです。

idx = numpy.argsort(x)
ans = [ (x[idx[i]],y[idx[i]]) for i in idx]
于 2009-07-05T18:09:08.297 に答える
2

最終的な ndarray を作成したときに、並べ替える軸を指定するだけでよいと思います。または、元の配列の 1 つを argsort すると、x と y の両方でルックアップするために使用できるインデックス配列が得られます。これは、値がまったく必要ないことを意味する場合があります。

(scipy.org は現在アクセスできないようです。または、いくつかのドキュメントへのリンクを投稿します)

あなたの説明がコード スニペットと完全に一致していないことを考えると、確実に言うのは難しいですが、numpy 配列の作成が複雑になりすぎていると思います。

于 2009-02-18T10:18:49.333 に答える
1

Numpy のsort関数を使用して有効な解決策を得ることができませんでしたが、次のように機能します。

import numpy
x = [5,4,3]
y = [33,44,55]
r = numpy.asarray([(x[i],y[i]) for i in numpy.lexsort([x])])

lexsort行をソート順に並べる配列インデックスの順列を返します。結果を複数のキーで並べ替えたい場合、たとえば byxと thenで並べ替える場合は、代わりyに を使用numpy.lexsort([x,y])します。

于 2009-02-18T10:27:04.447 に答える