numpyにまともに触れるのは今回が初めてです。
しょうもない質問で大変申し訳ないですがどうかお願いいたします。
丸投げと言われるかもしれないですが、具体的なプログラムまで書いていただければ嬉しいです。
前提
-
2つの1次元numpy配列aとbがある
-
a,b共に要素数は8で固定 全て相異なるfloat型の数値が入っている 欠損値は無い
求めたい値その1
- aの配列値を大きい順で見た時の上位3値のインデックスを求める
- 同じインデックスであるbの配列のそれぞれの値がbの中で大きい順で見た時に合計で何番目に来るかの合計を求める
例えば
a = [3.0 4.0 8.0 1.0 6.0 7.0 2.0 5.0]
b = [5.5 3.5 1.5 6.5 4.5 2.5 8.5 7.5]
であれば
1は8.0, 6.0, 7.0が上位最大3値に該当するのでそのインデックスは2, 4, 5
2でインデックス2, 4, 5は1.5, 4.5, 2.5が該当する
1.5, 4.5, 2.5はそれぞれbの中で1番目、4番目、2番目に小さい値なので合計は7 これが求めたい値
求めたい値その2
- aの配列値を大きい順で見た時の上位3値のインデックスを
順番
に求める - 同じインデックスであるbの配列のそれぞれの値を掛け算した要素数3の配列を求める
その1と同じabだとすると
1は8.0, 7.0, 6.0の順が上位最大3値順に該当するのでそのインデックス順は2, 5, 4
2でインデックス順2, 5, 4は1.5, 2.5, 4.5がこの順で該当する
なので求めたい配列はnp.array([8.01.5, 7.02.5, 6.0*4.5])で
np.array([12.0, 17.5, 27.0])となる
(追記)途中までやったところ
python
1c = np.argsort(a)[::-1][0:3]
ひとまずこれでaからのインデックスの抜き出しはできそうだと考えました。
で、この値を元にbにアプローチをかけようとしたのですが、
b[c[0]], b[c[1]], b[c[2]]といったやり方で抜き出し自体はできそうだと考えたのですが、
numpyにはより良い書き方があるのではないかと考えて質問に至った次第です。
(追記)解決しました
>>> a = np.array([3.0, 4.0, 8.0, 1.0, 6.0, 7.0, 2.0, 5.0]) >>> b = np.array([5.5, 3.5, 1.5, 6.5, 4.5, 2.5, 8.5, 7.5]) >>> idx = a.argsort()[::-1][:3] >>> np.sum(b.argsort()[idx]) 4
melianさんありがとうございましたm(_ _)m
回答1件
あなたの回答
tips
プレビュー