2016-07-21 3 views
0

숫자가 X이고 숫자가 (768, 8) 인 numpy 배열이 있습니다.파이썬에서 파이썬 배열의 행 추출하기

각 행의 마지막 값이 난 단지 값 1이있는 행을 원 0 또는 1, 그리고이 T를 호출 할 수 있습니다.

은 내가 그랬어 :

T = [x for x in X if x[7]==1] 

이것은, 그러나, 이것은 지금 목록이 아닌 NumPy와 배열 (사실 내가 T.shape를 인쇄 할 수 없습니다) 올바른입니다.

숫자가없는 배열로 유지하려면 어떻게해야합니까? 당신이 목록으로 T하고 있습니다

T = [x for x in X if x[8]==1] 

를 호출하여

+1

왜 그냥'T = np.array (T)'?? – ThePredator

+0

자, T에 대한 코드를 유지하고 다시 numpy 배열로 변환할까요? – user

답변

2

NumPy와의 부울 색인은 완전히 벡터화 방식으로 작업을 완료합니다. 이 방법은 일반적으로 목록 내포 및 형식 변환을 사용하는 것보다 효율적입니다.

T = X[X[:, -1] == 1] 

데모 :

In [232]: first_columns = np.random.randint(0, 10, size=(10, 7)) 

In [233]: last_column = np.random.randint(0, 2, size=(10, 1)) 

In [234]: X = np.hstack((first_columns, last_column)) 

In [235]: X 
Out[235]: 
array([[4, 3, 3, 2, 6, 2, 2, 0], 
     [2, 7, 9, 4, 7, 1, 8, 0], 
     [9, 8, 2, 1, 2, 0, 5, 1], 
     [4, 4, 4, 9, 6, 4, 9, 1], 
     [9, 8, 7, 6, 4, 4, 9, 0], 
     [8, 3, 3, 2, 9, 5, 5, 1], 
     [7, 1, 4, 5, 2, 4, 7, 0], 
     [8, 0, 0, 1, 5, 2, 6, 0], 
     [7, 9, 9, 3, 9, 3, 9, 1], 
     [3, 1, 8, 7, 3, 2, 9, 0]]) 

In [236]: mask = X[:, -1] == 1 

In [237]: mask 
Out[237]: array([False, False, True, True, False, True, False, False, True, False], dtype=bool) 

In [238]: T = X[mask] 

In [239]: T 
Out[239]: 
array([[9, 8, 2, 1, 2, 0, 5, 1], 
     [4, 4, 4, 9, 6, 4, 9, 1], 
     [8, 3, 3, 2, 9, 5, 5, 1], 
     [7, 9, 9, 3, 9, 3, 9, 1]]) 
+1

더 명확한/적은 오버 헤드를 위해 X.compress (마스크, 축 = 0)를 사용할 수도 있습니다. 마스크 대신 행 인덱스를 사용하면 X.take (rowxs, axis = 0)를 사용할 수 있습니다. Numpy의 멋진 인덱싱은 이러한 기능을 후드라고 부릅니다. – Erotemic

+0

감사합니다, 저에게도 뭔가 가르쳐주고 있습니다. – user

0

. NumPy와 배열에 어떤 목록을 변환하려면, 단지 사용

여기
T = numpy.array([x for x in X if x[8]==1]) 

이 일어나는 것이다 :

In [1]: import numpy as np 

In [2]: a = [1,2,3,4] 

In [3]: a.T 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-3-9f69ed463660> in <module>() 
----> 1 a.T 

AttributeError: 'list' object has no attribute 'T' 

In [4]: a = np.array(a) 

In [5]: a.T 
Out[5]: array([1, 2, 3, 4]) 

In [6]: 
+0

좋아, 그래서 목록에 중간 통로가 필요하고 다시 numpy 매트릭스가 필요합니다. 직접적인 전환은 없습니다. – user

+0

@user : 편집을 확인하십시오. 'numpy.array ([x가 x [8] == 1 인 경우 x는 x를 나타냅니다.) ' – ThePredator

+0

예, 동일합니다. 선호하는 numpy 작업이 있는지 궁금합니다. 어쨌든,이 작품, 감사합니다. – user

관련 문제