2014-11-13 2 views
0

FIT/FITS (기본적으로 이미지) 파일을 처리하는 일부 함수를 작성하려고합니다. 이 파일들은 천문학에서 흔히 볼 수 있습니다. 제 경우에는 여러 개의 보정 이미지가 있고 모든 이미지의 평균 또는 중간 값을 얻고 싶습니다. 내 이미지 (배열) 인 경우numpy 2D 배열의 평균 또는 평균을 얻기 전에 거절

그래서 기본적으로 : 중간 방법

ar1 = [[021, 654], [087, 065]] 
ar2 = [[009, 097], [879, 009]] 
ar1 = [[945, 008], [002, 007]] 

resoult 이미지 (배열)입니다 : 내가 찾은

평균에 대한

armed = [[021, 097],[087, 009]] 

와 같은 일 :

mainArray = [ar1, ar2, ar3] 
armed = numpy.median(mainArray, axis=0) 
arave = numpy.average(mainArray, axis=0) 
arsum = numpy.add(mainArray, axis=0) 
arsub = numpy.subtract(mainArray, axis=0) 

이들은 잘 작동하고 있습니다. 그러나 나는 거부감을 너무주고 싶다. 예를 들어, 배열을 평균하기 전에 min-max rejection을 사용하고 싶습니다.

4 가지 유형의 거부와 3 가지 유형의 거부가 있습니다.

결합 유형 : 합계, 뺄셈, 중간 값 및 평균. 거부 ​​유형 : none, min-max, sigma 클립.

배열을 결합하기 전에 거부하는 방법은 무엇입니까?

방금 ​​min-max 거부를 수행 할 클래스를 작성했습니다. 그러나 10X (2048x2048) 배열의 min-max를 거부하는 데 영원히 걸렸습니다. 그리고 실제로, inArray는 (10, 2048, 2048) 모양입니다.하지만 그 대가로 (2048, 2048, 8). 8은 최소 최대 거부를 의미합니다. 그러나 반대. .. 나는,이 배열의 평균, 합계 등을 의미, 중간 얻을 수 있습니다하지만 너무 오래 걸려서이 후 :(

def minmaxrej(self, inArray, verb=False): 
    """ 
    Returns all images minmax rejected. 

    @param inArray: All arrays to reject minmax. It'll return a reverced array. 
    @type inArray: numpy.array 
    @param verb: Get information while operation (Optional, False by default). 
    @type verb: boolean 
    @return: numpy.array 
    """ 
    if type(inArray) == numpy.ndarray: 
     if len(inArray.shape) == 3: 
      if inArray.shape[0] > 2: 
       poi = [] 
       ln = [] 
       lst = [] 

       for i in xrange(inArray.shape[1]): 
        for u in xrange(inArray.shape[2]): 
         for k in xrange(inArray.shape[0]): 
          poi.append(inArray[k][i][u]) 
         poi = numpy.sort(poi)[1:-1] 
         ln.append(poi) 
         poi = [] 
        lst.append(ln) 
        ln = [] 
       lst = numpy.asarray(lst) 
       if verb: 
        print "'minmaxrej' done." 
       return lst 

      else: 
       if verb: 
        print "Min-Max rejection requires at least 3 arrays. Got %s." %(inArray.shape[0]) 
     else: 
      if verb: 
       print "Wrong array shape. Expected array type: %s" %(inArray.shape) 
    else: 
     if verb: 
      print "Unexpected input type for input arrays.\nArray expected.\nReceived %s" %(type(inArray)) 

나는이 일을보다 효과적이고 빠른 방법이 필요

답변

0

새로운 기능 :.

import numpy as np 
ar1 = [[21, 654], [87, 65]] # this is a nested list and becomes matrix-like if np.array(ar1) is called 
ar2 = [[9, 97], [879, 9]] 
ar3 = [[945, 8], [2, 7]] 
all_arr = np.array([ar1,ar2,ar3]) # This is a list of 'matrices'/np.arrays with shape (m,n) 
matrix = all_arr.reshape((3,4)).T # This is getting rid of the list so that we now have an array of shape (#arrs, #len(each arr)) 

난 전치 사용하므로 각 화상 (예 AR1) 열이고, 각 행은 사용자 수 후 defin 화소

Output: 
array([[ 21, 9, 945], 
     [654, 97, 8], 
     [ 87, 879, 2], 
     [ 65, 9, 7]]) 

것을 그런 다음 우리의 '매트릭스'를 필터링에

def is_min_or_max(X): 
    return (X == np.max(X))|(X == np.min(X)) 

싶습니다 어떤 필터 전자 당신은 map(is_min_or_max, matrix) 같은과 모든 행/픽셀이 '필터'를 적용 할 수 있습니다. 이것은 당신에게 줄 것이다 :

Output: 
[array([False, True, True], dtype=bool), 
array([ True, False, True], dtype=bool), 
array([False, True, True], dtype=bool), 
array([ True, False, True], dtype=bool)] 

난 당신이 필터 중 하나가 그 이미지의 픽셀의에 적용 할 경우 사진 (arr1)를 폐기하려면 제대로 이해하면, 그 어떤 경우 사진을 폐기 의미 배열의 값은 true입니다. 그런 다음 행렬을 얻습니다.

matrix[:, np.invert(map(any, map(is_min_or_max, matrix)))] 

Output: array([], shape=(4L, 0L), dtype=int32) 

모든 이미지에 제외 요인이 있기 때문에이 경우 비어 있습니다. 비어 있지 않은 경우 이미 선택한 것처럼 축 (픽셀 또는 이미지)을 통해 np.mean() 등의 기능을 사용할 수 있습니다.OLD


:

가 두 축에서 쉽게 슬라이스 및 부울 필터링을 지원으로 귀하의 경우에는 아마 NumPy와 매트릭스 작업을 것입니다.

import numpy as np 
import itertools 

ar1 = [[21, 654], [87, 65]] 
ar2 = [[9, 97], [879, 9]] 
ar3 = [[945, 8], [2, 7]] 

ar1 = list(itertools.chain.from_iterable(ar1)) 
ar2 = list(itertools.chain.from_iterable(ar2)) 
ar3 = list(itertools.chain.from_iterable(ar3)) 
mat = np.matrix([ar1,ar2,ar3]) 
armed = np.median(mat,0) 
arave = np.mean(mat,0) 

... 등등. 그 후, 제 1 열에 대해서는

mat[mat[:,0] < np.max(mat[:,0])] 

과 같이 슬라이스하여 행렬에 대한 거부를 행할 수있다. 모든 열에 대한

+0

ittertools 단지 (4194304) 내 (2048,2048) 모양의 배열을 변환

감사 조건을 결합 할 수 있도록 슬라이스는뿐만 아니라 부울 행렬이 될 수 있습니다. 나는 모든 1stx1st, 1stx2end, 1stx3rd ... 2047thx2047th 및 2048thx2048th 값의 중앙값을 얻고 싶었습니다. – MSH

+0

예에서 세 개의 중첩 목록 (ar1, ar2 및 ar1 다시 사용)을 사용하는 경우 3 개 목록 (ar1, ar2, ar3)의 첫 번째 목록에있는 모든 첫 번째 항목의 중앙값을 원하지 않으십니까? 행렬을 만들고 벡터화 (실제로 속도를 높이기) 때문에 중첩 된 목록은 먼저 행렬의 "행"으로 사용할 플랫 목록이되어야합니다. itertools.chain이 수행해야하는 작업입니다. – rustil

+0

실제로 프로세스 후에 매트릭스가 바뀌는 경우에만 작동합니다. 이 과정을 거친 후에는 벡터가 매트릭스가 아니기 때문입니다. 재 형성은 문제가되지 않습니다. 문제는 다음과 같습니다. 이미지 데이터로 작업하고 있습니다. 그래서 10 장의 이미지가 있고 교정 이미지입니다. 모든 픽셀의 평균을 얻고 싶습니다. 모든 첫 번째 픽셀의 평균이 첫 번째 픽셀이 될 것이고, 모든 두 번째 픽셀의 평균은 두 번째 픽셀이 될 것입니다. 거절을 말하면 위의 프로세스에서 최소 최대 거부를 의미합니다. 모든 첫 번째 픽셀의 평균을 구할 때 최소 최대 거부를 수행하려고합니다. 그리고 적어도 나는 이미지를 가질 것이다. – MSH

관련 문제