2013-08-23 1 views
2

3xN numpy 배열에 대한 연산을 정의했으며 배열의 각 열을 반복하고 싶습니다. 내가하고있는 것1 차원 배열 인 경우 1을 반환하는 열 수 검사 numpy 배열

for i in range(nparray.shape[1]): 

그러나 nparray.ndim == 1 인 경우이 작업은 실패합니다. numpy 배열의 열 수를 확인하는 명확한 방법이 있습니다.이 배열은 MATLAB의 크기 연산과 같이 1 차원 배열 인 경우 1을 반환합니다. 그냥 뭔가를 덜 장황 찾고 있다면 그렇지 않으면, 내가

if nparray.ndim == 1: 
    num_points = 1 
else: 
    num_points = nparray.shape[1] 

for i in range(num_points): 
+0

부수적으로, 처음에 열을 반복하는 대신 열 인덱스를 반복하는 이유는 무엇입니까? – abarnert

답변

3

를 구현 한, 당신이 할 수 있습니다 : 물론, 새로운 임시 배열을 만들 것입니다

num_points = np.atleast_2d(nparray).shape[1] 

은 걸릴하기 위해 모양은 조금 어리 석다. 그러나 그것은 단지 같은 기억의 단지보기이기 때문에 꽤 쌌다.

그러나, 내가 함께 할 수있는 것을 제외하고는 사용자의 명시 적 코드가 더 읽을 생각 try A : 당신이 반복적으로이 일을하는 경우

try: 
    num_points = nparray.shape[1] 
except IndexError: 
    num_points = 1 

, 당신이 무엇이든, 당신이 그것을 포장한다 기능. 예를 들어 :

def num_points(arr, axis): 
    try: 
     return arr.shape[axis] 
    except IndexError: 
     return 1 

은 그럼 당신은 작성해야 모든입니다

for i in range(num_points(nparray, 1)): 

물론 그것은 당신이 한 장소, 예를 들어, :

def num_points(arr, axis): 
    return nparray[:,...,np.newaxis].shape[1] 
2
을 편집하여 모든 곳에서 일을 변경할 수 있습니다 의미

원 라이너를 보관하고 싶다면 conditional expressions을 사용하는 방법 :

for i in range(nparray.shape[1] if nparray.ndim > 1 else 1): 
    pass 
0

기본적으로 반복하려면 np.array은 행을 반복하는 것을 의미합니다. 당신이 열을 반복해야하는 경우, 단지 전치 배열을 반복 :

>>> a2=array(range(12)).reshape((3,4)) 
>>> for col in a2.T: 
    print col 

[0 4 8] 
[1 5 9] 
[ 2 6 10] 
[ 3 7 11] 

배열 array([1,2,3])의 의도 된 행동이 무엇인가, 그것은 하나 개의 열을 가진 3 COLS을 가진 것으로 취급된다?

>>> a1=array(range(3)) 
>>> for col in a1.reshape((3,-1)).T: 
print col 

[0 1 2] 

그래서 일반적인 솔루션 : for col in your_array.reshape((3,-1)).T: #do something

당신이 배열이 단지 1 열을 필요로 처리해야로서이, 의도 된 행동해야 즉, 모든 3XN 어레이 것을 언급 한 혼란