2016-08-21 3 views
-3

전체 배열에서 직접 두 값을 포함 dicts 및 기타 dicts의 배열 정규화 :I (예 : 행)처럼 보이는 거대한 배열이

[ 
     { 
      'value':21, 
      'openValues':{ 
       'a':24, 
       'b':56, 
       'c':78 
       } 
     }, 
     { 
      'value':12, 
      'openValues':{ 
       'a':98, 
       'b':3 
       } 
     }, 
     { 
      'value':900, 
      'openValues':{ 
       'a':7811, 
       'b':171, 
       'c':11211, 
       'd':4231 
       } 
     } 
     ] 

를 그리고 각각의 모든 값을 정상화 할을 키와 키 내의 각 딕셔너리 내의 값은 따라서 예를 들어 0과 1 사이로 :

[{ 
     'value':(21-12)/(900-12), 
     'openValues':{'a':(24-24)/(7811-24),'b':(56-3)/(171-3),'c':(78-78)/(11211-78)} 
    }, 
    { 
     'value':(12-12)/(900-12), 
     'openValues':{'a':(98-24)/(7811-24),'b':(3-3)/(171-3)} 
    }, 
    { 
     'value':(900-12)/(900-12), 
     'openValues':{'a':(7811-24)/(7811-24),'b':(171-3)/(171-3),'c':(11211-78)/(11211-78),'d':(4231-4231)/(4231-4231)} 
    }] 

볼 수 있듯이, 각 01,236,506 : 여기

수행되는 계산이다이 정규화되었습니다 (최소값을 뺀 다음 값 범위로 나눕니다). 각 키 - 값 쌍은 openValues과 동일합니다.

어떻게하면됩니까? 이것은 기존 방식이었다로

제가 추가 최대/최소/범위 값 및 dicts를 작성하는 것보다 더 빠른 방법을 찾을 (이는 openValues 딕셔너리의 최대와 최소를 계산하는 예이다

openValuesMin = {} 
    openValuesMax = {} 
    for i, dict in enumerate(array): 
     for property,value in dict['openValues'].items(): 
      if property not in openValuesMax: 
       openValuesMax[property] = 0 
      if openValuesMax[property]<value: 
       openValuesMax[property]=value 
      if property not in openValuesMin: 
       openValuesMin[property] = 0 
      if openValuesMin[property]>value: 
       openValuesMin[property] = value 

    openValuesRange = {key: openValuesMax[key] - openValuesMin.get(key, 0) for key in openValuesMax.keys()} 

이 방법으로 모든 것을 정상화에 한 줄 솔루션이 있습니까?

+1

처럼 위의 코드를 확장 할 수

. 그것은 작동하지 않았다. 파이썬 코드에 어딘가에','가 없습니다. 유효하지 않습니다. –

+0

또한 귀하의 접근 방식은 무엇입니까? 너 뭐 해봤 니? 어디에서 문제를 만났습니까? ** 정확한 질문은 무엇입니까? ** –

+1

'''}'''이후에 16 행에 쉼표가 누락되었습니다. – user1406062

답변

1

내가 아주 잘 당신의 질문을 이해하지만 최소 & 최대 고려 [0-1] 사이 정상화하려는 가정 한 확실하지 배열에있는 모든 가능한 항목의 값입니다. 가능한 해결책은 다음과 같습니다.

array = [ 
    { 
     'value': 21, 
     'openValues': { 
      'a': 24, 
      'b': 56, 
      'c': 78 
     } 
    }, 
    { 
     'value': 12, 
     'openValues': { 
      'a': 98, 
      'b': 3 
     } 
    }, 
    { 
     'value': 900, 
     'openValues': { 
      'a': 7811, 
      'b': 171, 
      'c': 11211, 
      'd': 4231 
     } 
    } 
] 


def normalize(v0, v1, t): 
    return float(t - v0)/float(v1 - v0) 


def f(v0, v1, item): 
    return { 
     "value": normalize(v0, v1, item["value"]), 
     "openValues": { 
      k: normalize(v0, v1, v) for k, v in item["openValues"].iteritems() 
     } 
    } 

values = sum([[item["value"]] + item["openValues"].values() 
       for item in array], []) 
v_min, v_max = min(values), max(values) 
output = [f(v_min, v_max, item) for item in array] 
print output 

편집 : 별도로 값과 openValues을 고려 정상화하려는 경우, 당신은 내가 당신의 딕셔너리가 읽을 수 있도록 노력이

array = [ 
    { 
     'value': 21, 
     'openValues': { 
      'a': 24, 
      'b': 56, 
      'c': 78 
     } 
    }, 
    { 
     'value': 12, 
     'openValues': { 
      'a': 98, 
      'b': 3 
     } 
    }, 
    { 
     'value': 900, 
     'openValues': { 
      'a': 7811, 
      'b': 171, 
      'c': 11211, 
      'd': 4231 
     } 
    } 
] 


def normalize(v0, v1, t): 
    return float(t - v0)/float(v1 - v0) 


def f(vmin0, vmax0, vmin1, vmax1, item): 
    return { 
     "value": normalize(vmin0, vmax0, item["value"]), 
     "openValues": { 
      k: normalize(vmin1, vmax1, v) for k, v in item["openValues"].iteritems() 
     } 
    } 

values = [item["value"] for item in array] 
v_min0, v_max0 = min(values), max(values) 
values = sum([item["openValues"].values() for item in array], []) 
v_min1, v_max1 = min(values), max(values) 

output = [f(v_min0, v_max0, v_min1, v_max1, item) for item in array] 
print output 
+0

안녕하세요 @ BPL이 배열의 모든 값을 정상화. 예를 들어, 각 키를 개별적으로 표준화하기 위해 찾고 있습니다. 'value'의 값은 범위 (21-900)에서 정규화되고'openValues ​​: { 'a''의 값은 해당 범위에서 표준화됩니다. 24-7811). –

+0

@DhruvGhulati 아, 알았어, 이제 내 질문을 검토하고 다음 새 솔루션을 추가하자. :) – BPL

+1

@DhruvGhulati 좋아, 나는 당신의 기능에 대한 코드를 확장했습니다, 그것이 도움이되기를 바랍니다. – BPL

관련 문제