2014-10-19 3 views
3

두 개의 다른 배열로 구성된 numpy 배열을 원합니다 (각각 다른 모양을 가짐). 아시다시피, 이런 이유 때문에 메인 어레이의 정의에 dtype = object을 사용해야합니다.다른 모양의 요소가있는 numpy.array

예를 들어, 우리가이 완벽하게 작동

 a0 = np.arange(2*2).reshape(2,2) 
    a1 = np.arange(3*3*2).reshape(3,3,2) 
    b = np.array([a0,a1], dtype = object) 

로 (파이썬 2.7에서) 우리의 배열을 정의 할 수 있습니다 : b[1]a1과 동일합니다. I가 (2,2)에서 a0의 차원을 변경한다면 이상한 (3,3) 일이 발생합니다

 a0 = np.arange(3*3).reshape(3,3) 
    a1 = np.arange(3*3*2).reshape(3,3,2) 
    b = np.array([a0,a1], dtype = object) 

b[1]a1가 동일하지이 시간, 그들은 심지어 다른 모양을 가지고있다. 이 이상한 행동의 이유는 무엇입니까?

아마 나를위한 완전히 다른 해결책이 있습니다. 그러나 나는 목록이나 튜플을 사용하고 싶지 않다. 왜냐하면 나는 b + b과 같은 추가를 허용하기를 원하기 때문이다. 이 목적을 위해 자신 만의 클래스를 작성할 수는 있지만, 더 간단한 방법이 있습니까?

답변

2

, 당신은 첫 번째 유형 객체와 하늘의 배열을 생성하고 할당 할 수 있습니다 : 당신이 연산을 수행하거나 성장하기 전에

x = empty(5, dtype=object) 
x[0] = zeros((3,3)) 
x[1] = zeros((3,2)) #does not merge axes. 
x[2] = eye(4) 
x[3] = ones((2,2))*2 
x[4] = arange(10).reshape((5,2)) 

>>> x+x 
array([array([[ 0., 0., 0.], 
    [ 0., 0., 0.], 
    [ 0., 0., 0.]]), 
    array([[ 0., 0.], 
    [ 0., 0.], 
    [ 0., 0.]]), 
    array([[ 2., 0., 0., 0.], 
    [ 0., 2., 0., 0.], 
    [ 0., 0., 2., 0.], 
    [ 0., 0., 0., 2.]]), 
    array([[ 4., 4.], 
    [ 4., 4.]]), 
    array([[ 0, 2], 
    [ 4, 6], 
    [ 8, 10], 
    [12, 14], 
    [16, 18]])], dtype=object) 

당신은 모든 요소를 ​​기입해야합니다 np.append를 사용하여 크기가 0 인 요소.

+0

예에서 전체 배열'x'에 대해 산술 연산을 수행 할 수 없습니다. 예를 들어'x + x'는 작동하지 않습니다. – cheyp

+1

네, 할 수 있습니다! 내가 말했던 것처럼 모든 요소 0..4를 채워야합니다 (처음 두 개만 예를 든다). – mdurant

3

나는 그것이 이상한 행동이라고 생각하지 않는다. 그것은 당신이 나에게 이상한 numpy를 사용하는 방법이다.

numpy는 최대한 많은 차원을 병합합니다. 이것이 기본 동작이며 배열을 사용하여 작업 할 때 예상되는 것입니다. 첫 번째 예에서는 a0a1의 모든 크기가 다릅니다. numpy는 첫 번째 차원 만 사용해야합니다. 첫 번째 예에서 b.shape을 보면 (2,)가 표시됩니다.

두 번째 예에서 a0a1은 마지막 치수까지 동일한 치수 크기를 갖습니다. 이렇게 numpy는 그 수준을 합병한다. 여기에서 b.shape을 보면 두 번째 및 세 번째 차원의 크기가 같기 때문에 (2,3,3)이 표시됩니다. 당신이 명시 적으로 객체 배열을 원하는 경우에

관련 문제