2016-10-24 3 views
1

희소하고 대칭 인 배열이 있는데 해당 배열의 행과 열을 삭제하려고합니다. 주어진 행 (및 열)의 모든 개별 항목이 특정 임계 조건을 충족시키지 못하는 경우 예를 들어행 (또는 열)의 모든 값이 주어진 contion을 만족하지 않는 경우 대칭 배열의 행과 열 삭제

min_value = 2 
a = np.array([[2, 2, 1, 0, 0], 
       [2, 0, 1, 4, 0], 
       [1, 1, 0, 0, 1], 
       [0, 4, 0, 1, 0], 
       [0, 0, 1, 0, 0]]) 

는 난이 적어도 2 이상의 값이되도록 상기 예와이 수득 할 한 행 (및 열)을 유지하려는 경우

a_new = np.array([2, 2, 0], 
       [2, 0, 4], 
       [0, 4, 1]] 

그래서 모든 항목이 2보다 적기 때문에 행 3과 5 (및 열 3과 5)를 잃을 것입니다. How could I remove the rows of an array if one of the elements of the row does not satisfy a condition?, Delete columns based on repeat value in one row in numpy arrayDelete a column in a multi-dimensional array if all elements in that column satisfy a condition을 살펴 보았지만 표시된 해결책은 달성하려는 내용과 맞지 않습니다. .

내가 비슷한 무언가를 수행하는 생각을했다 :

a_new = [] 
min_count = 2 

for row in a: 
    for i in row: 
     if i >= min_count: 
      a_new.append(row) 
    print(items) 
print(temp) 

하지만 나쁜 열을 삭제하지 않기 때문에 문제가 해결되지 않고 두 개 (또는 그 이상)의 인스턴스가있는 경우 큰 값이다 임계 값은 여러 번 행을 추가합니다.

답변

1

아래 그림과 같이 당신은 그것을 해결하는 벡터화 된 솔루션을 가질 수 -

# Get valid mask 
mask = a >= min_value 

# As per requirements, look for ANY match along rows and cols and 
# use those masks to index into row and col dim of input array with 
# 1D open meshes from np.ix_ and thus select a 2D slice out of it 
out = a[np.ix_(mask.any(1),mask.any(0))] 

그것과 같이, 행과 다음 열을 선택하여이 될 것 표현하는 간단한 방법 -

a[mask.any(1)][:,mask.any(0)] 

입력 배열의 대칭 특성을 악용하면 다음과 같이 단순화됩니다. -

mask0 = (a>=min_value).any(0) 
out = a[np.ix_(mask0,mask0)] 

샘플 실행 - 또는

In [488]: a 
Out[488]: 
array([[2, 2, 1, 0, 0], 
     [2, 0, 1, 4, 0], 
     [1, 1, 0, 0, 1], 
     [0, 4, 0, 1, 0], 
     [0, 0, 1, 0, 0]]) 

In [489]: min_value 
Out[489]: 2 

In [490]: mask0 = (a>=min_value).any(0) 

In [491]: a[np.ix_(mask0,mask0)] 
Out[491]: 
array([[2, 2, 0], 
     [2, 0, 4], 
     [0, 4, 1]]) 

, 우리는과 같이, 유효 마스크의 행과 열 인덱스를 사용할 수 있습니다 -

r,c = np.where(a>=min_value) 
out = a[np.unique(r)[:,None],np.unique(c)] 

다시 대칭 특성을 악용, 단순화 된 버전 것 be -

r = np.unique(np.where(a>=min_value)[0]) 
out = a[np.ix_(r,r)] 

r도 부울 연산을 혼합하여 얻을 수 있습니다. -

r = np.flatnonzero((a>=min_value).any(0)) 
+0

대단히 감사합니다. 예상보다 훨씬 웅장합니다. 이것은 중요하지 않지만 삭제 된 행 및 열 목록을 생성하는 방법이 있습니까? – Lukasz

+1

@ 루카스'np.flatnonzero (~ ((a> = min_value) .any (0)))'? – Divakar

+0

은 빈 목록을 생성합니다. 이리스트를 생성하는 것은 대단히 중요하지 않습니다. 특히 더 큰 행렬에 대해서는 좋았을 것입니다. – Lukasz

관련 문제