2017-12-03 5 views
1

オブジェクト私はpoly1dオブジェクトの配列を作成するには、最初のnumpyの中で、それが可能であるという事実とこれを開始したいと思います:numpyの問題が

random_poly = np.frompyfunc(lambda i, j: np.poly1d(np.random.randint(1, 4, 3)), 2, 1) 
def random_poly_array(shape):  
    return np.fromfunction(random_poly, shape) 

a1 = random_poly_array((3,3)) 

これはうまく動作しますが、そして私たちもnp.dotを使用して、このフォームから作られた行列を乗算することができます

a2 = random_poly_array((3,3)) 
a1_x_a2 = np.dot(a1, a2) 

はしかし、他のほとんどの方法が機能しません。たとえば、特定のpoly1dオブジェクトのリストを取ることができないと、配列に変換:そのよう

np.array([np.poly1d([1,2,3]), np.poly1d([1,2,3])]) 

ValueError: cannot copy sequence with size 2 to array axis with dimension 3が発生します。混乱に追加するには、

np.array([np.poly1d([1,2]), np.poly1d([1,2])]) 

はエラーを発生させ、代わりにちょうど2のの2x2配列を作成しません。 dtype=objectを追加しても影響はなく、numpyはまだpoly1dオブジェクトを配列に変換しようとします。


これが問題である理由は、1つの次元Dのアレイを取り、寸法D-1poly1dオブジェクトの配列に変換することができないということです。私はpoly1dオブジェクトの配列を返すには

arr = np.arange(1, 10).reshape(3,3) 
np.apply_along_axis(np.poly1d, 0, arr) 

を期待しているだろうが、代わりにそれはunalterated配列を返します。さらに悪いことに、arr=np.arange(9).reshape(3,3)の場合、最初のpoly1dオブジェクトの作成時に、係数がゼロであるため3の代わりに2の長さになるため、エラーが発生します。したがって、私の質問はこれです:numpyでpoly1d配列を作成するための実現可能な方法はありますか?そうでない場合は、どうしてですか? 、配列にPaul Panzerによって私の注意に持って来ら何かをオブジェクトをブロードキャストしないようにnumpyを強制Noneの概念を使用して

+1

np.array([None、np.poly1d([1,2])、np.poly1d([1,2])])[1:] 'を実行できます。正確ではありませんが、動作します。 –

+0

これは面白い方法ですが、私はそれを使って別の配列から 'poly1d'配列を作成する方法を考え出したと思います。 – Sebastian

+0

答えとして共有してみませんか? –

答えて

1

は、私がpoly1dオブジェクトに最後の軸を変換する関数を作成:

def array_to_poly(arr): 
    return np.apply_along_axis(lambda poly: [None, np.poly1d(poly)], -1, arr)[..., 1] 

arr = np.arange(1, 25).reshape(2,3,4)でテストを

def array_to_poly(arr, axis=-1): 
    temp_arr = np.apply_along_axis(lambda poly: [None, np.poly1d(poly)], axis, arr) 
    n = temp_arr.ndim 
    s = [slice(None) if i != axis%n else 1 for i in range(n)] 
    return temp_arr[s] 

:我々は、単一の機能で複数のシステムを悪用して大丈夫だ場合は、我々はそれが任意の軸の上に適用することができます次のようになります。

In [ ]: array_to_poly(arr, 0) 
Out[ ]: 
array([[poly1d([ 1, 13]), poly1d([ 2, 14]), poly1d([ 3, 15]), 
     poly1d([ 4, 16])], 
     [poly1d([ 5, 17]), poly1d([ 6, 18]), poly1d([ 7, 19]), 
     poly1d([ 8, 20])], 
     [poly1d([ 9, 21]), poly1d([10, 22]), poly1d([11, 23]), 
     poly1d([12, 24])]], dtype=object) 

In [ ]: array_to_poly(arr, 1) 
Out[ ]: 
array([[poly1d([1, 5, 9]), poly1d([ 2, 6, 10]), poly1d([ 3, 7, 11]), 
     poly1d([ 4, 8, 12])], 
     [poly1d([13, 17, 21]), poly1d([14, 18, 22]), poly1d([15, 19, 23]), 
     poly1d([16, 20, 24])]], dtype=object) 

In [ ]: array_to_poly(arr, 2) 
Out[ ]: 
array([[poly1d([1, 2, 3, 4]), poly1d([5, 6, 7, 8]), 
     poly1d([ 9, 10, 11, 12])], 
     [poly1d([13, 14, 15, 16]), poly1d([17, 18, 19, 20]), 
     poly1d([21, 22, 23, 24])]], dtype=object) 

期待どおりです。

関連する問題