2017-12-03 1 views
1

내가 먼저가, NumPy와에, poly1d 객체의 배열을 만들 수 있다는 사실이 밖으로 시작하고 싶습니다 개체 우리는 심지어 np.dot를 사용하여이 양식에서 만든 행렬을 곱할 수 :NumPy와 문제

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 개 개체를 배열로 변환하려고 시도합니다.


이것이 문제가되는 이유는, 하나의 차원 D 의 배열을 취하고 측정 D-1의poly1d 오브젝트의 배열로 변환 할 수 있다는 것이다. 나는 poly1d 객체의 배열을 반환하려면

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

을 기대했을 것이다, 대신 그것은 unalterated 배열을 반환합니다. 첫 번째 poly1d 개체는 0 계수 때문에 3 대신 길이가 2가되므로 더 나쁜 경우 arr=np.arange(9).reshape(3,3) 인 경우 오류가 발생합니다. 따라서, 제 질문은 이것입니다 : numpy에서 poly1d 배열을 만들 수있는 가능한 방법은 무엇입니까? 그렇지 않다면 왜 안 되겠습니까?

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

: 배열로 객체를 방송하지 numpy 강제 None의 개념을 사용

+1

np.array ([없음, np.poly1d ([1,2]), np.poly1d ([1,2])) [1 :]'할 수 있습니다. 정확하지는 않지만 작동합니다. –

+0

그게 흥미로운 방법이고, 나는 그것을 사용하여 다른 배열에서'poly1d' 배열을 만드는 방법을 알았습니다. 감사합니다. – Sebastian

+0

왜 답을 공유하지 않습니까? –

답변

1

, 뭔가 Paul Panzer으로 내 관심을 끌게, 나는 poly1d 객체로 마지막 축 변환하는 함수를 만들었습니다 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) 

예상대로.