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

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




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

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

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

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



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

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




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



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





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


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

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



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



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



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


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

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



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



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

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