2015. 7. 4. 04:06 - 성돌

[Mathematica] 행렬에서 특정 조건을 만족하는 데이터만을 삭제하거나 뽑아내기




데이터를 다루다보면,
특정 조건을 만족하는 데이터만 추출하거나 삭제해야 하는 일들이 빈번하게 발생한다.

이런 경우, Position기능에서 _?()옵션을 사용함으로써 쉽게 문제를 해결할 수 있다.

예를 들어, 아래와 같이 말이다.

아래의 예들은 데이터들 중 지정한 '최소값'보다 큰 값들이나 '최대값'보다 작은 값들의 위치를 찾는 코드이다.
특정값과 동일한 위치를 찾을 때는 _?()옵션 없이 Position기능을 사용하면 된다 (다른 포스팅 참고).


1
2
Position[데이터, _?(# > 최소값 &)]
Position[데이터, _?(# < 최대값 &)]


예를 들어
yData={1,5,2,1,10}
인 yData값으로부터 4보다 큰 값들이 있는 위치를 알고자 한다고 해보자.

이 때, 아래와 같이 할 수 있다.


1
2
yData={1,5,2,1,10}
Position[yData, _?(# > 4 &)]


Position기능을 통해서 얻을 수 있는 결과값은 리스트의 형태로써 아래와 같이 주어진다.

1
{{첫번째 위치},{두번째 위치},...}


예를 들어, 위의 조건을 만족시키는 위치는 2번째, 5번째 위치이기에,
아래와 같은 결과값을 얻게될 것이다.

1
{{2},{5}}




이런 형태에 결과값은 Mathematica에서 ExtractDelete기능과 함께 사용될 수 있다.


Extract가 특정 데이터를 뽑아내는 것과 달리,
Delete는 특정 데이터를 삭제하는 건데 사용법은 Extract와 완전히 동일하다.
사용법이 동일하기에 이 포스팅에서는 Extract로만 설명을 하도록 하겠다.

예를 들어, 데이터에서 2, 5번째 위치에 있는 데이터만 뽑아내려면 아래와 같이 하면 된다.

1
Extract[행렬이나 벡터 형식의 데이터,{{2},{5}}]


물론, 앞서 사용했던 Position구문을 Extract안에 적어서 아래와 같이 사용하는 것도 당연히 가능하다.

1
Extract[행렬이나 벡터 형식의 데이터,Position[벡터 형식의 데이터, _?(# > 최소값 &)]]


즉, 아래와 같이 사용할 수 있다는 거다.

1
2
yData={1,5,2,1,10}
Extract[yData,Position[yData, _?(# > 4 &)]]


이렇게 하면 결과값으로 4보다 큰 값들인 {5,10}으로 결과값을 얻게 된다.


이러한 기능은 앞서 적힌 것처럼 벡터 형식의 데이터 뿐 아니라
x와 y값으로 이루어진 행렬 형태의 데이터와도 작동한다.

즉, x와 y데이터가 아래와 같이 있다고 하자.
(y데이터는 지금까지와 동일하고, x값만 추가시킨 것임)

1
xyData={{1,1},{2,5},{3,2},{4,1},{5,10}}


y데이터를 기준으로 y가 4보다 큰 xy의 데이터를 구하는 코드는 아래와 같다.

1
Extract[xyData,Position[xyData[[All,2]], _?(# > 4 &)]]


위에서 xyData[[All,2]]는 yData데이터 값만으로 뽑아내는 걸 의미한다.

이렇게 하면, 기준에 맞는 데이터만 추출되게 되어 {{2,5},{5,10}}가 결과값으로 남게된다.