2012-03-05 9 views
1

私は宿題の代入のために多項式変換に取り組んでいます。私は出発点としてvanderbilt.eduの文書を使用しています。 Polynomial Transformポイントの集合から多項式配列を構築するナンシーの方法

私は点の集合があります

square_points = (
    # x, y 
    (37, 44), # x1,y1 
    (67, 74), # x2,y2 
    (97,104), # x3,y3 
    (247,194), # x4,y4 
    (157, 97), # x5,y5 
) 

私は多項式としてnumpyの配列、行に変身したいと思います:

[[1, x1, y1, x1*y1], 
[1, x2, y2, x2*y2], 
[1, x3, y3, x3*y3], 
[1, x4, y4, x4*y4], 
[1, x5, y5, x5*y5]] 

を私はまだnumpyのを学んでいます。私はポイントのリストからそのような配列を作るきれいな方法を学びたいと思う。

([1]など[0]ハードコードsquare_pointsからアレイの構築とは対照的に)これまでのところ私は:

P = np.ones((5,5)) 
P[:,1] = [ n[0] for n in square_points ] 
P[:,2] = [ n[1] for n in square_points ] 
P[:,3] = [ n[0]*n[1] for n in square_points ] 

ビット面倒思われます。このような配列を作成するために、より洗練された、もっとナンシーな方法がありますか?

答えて

2

確かに!ちょうどあなたがしていることをやってみましょう。しかし、リストの理解を外してください。...

例:

import numpy as np 
square_points = np.array([ 
    [37, 44], # x1,y1 
    [67, 74], # x2,y2 
    [97, 104], # x3,y3 
    [247, 194], # x4,y4 
    [157, 97], # x5,y5 
    ]) 
x, y = square_points.T 

P = np.ones((5,4)) 
P[:,1] = x 
P[:,2] = y 
P[:,3] = x * y 

それとも、好むならば、あなたも1行でそれを行うことができます。

P[:,1:] = np.array([x, y, x*y]).T 
+1

ここでの列はx0 ** 0 * x1 ** 0、x0 **という意味で、座標のすべての力に(よく、 'a')一般化を扱う良い方法を考えることができますか? 1 * x1 ** 0など?私はそれをsemi-brute-forceにすることができますが、純粋にnumpyベースのone-linerがあるべきであるように感じます。 – DSM

+0

素晴らしい!ナンシーは私を驚かせ続けている。 Thxはもっと素晴らしいnumpyの助けに! –

1

ます。また、このようなMDP toolkitで見つかった一人として、より一般的な多項式展開カーネルで見ることができます

関連する問題