跨多维数组标准化

问题描述 投票:0回答:1

我有大量的多维数组数据,其最基本的看起来像这样:

[
  {
    'a': 'a1',
    'b': [
           {
             'ba': 'ba1',
             'bb': 1,
             'bc': {
                     'bca': 'bca1',
                     'bcb': 4
                   }
           },
           {
             'ba': 'ba2',
             'bb': 2,
             'bc': {
                     'bca': 'bca2',
                     'bcb': 5
                   }
           },
           {
             'ba': 'ba3',
             'bb': 3,
             'bc': {
                     'bca': 'bca3',
                     'bcb': 6
                   }
           }
         ]
  },
  ...
]

我想要做的是标准化顶级数组中每个对象内的“bb”和“bcb”值。

也就是说,我想以这样的方式结束:

[
  {
    'a': 'a1',
    'b': [
           {
             'ba': 'ba1',
             'bb': 0,
             'bc': {
                     'bca': 'bca1',
                     'bcb': 0
                   }
           },
           {
             'ba': 'ba2',
             'bb': 0.5,
             'bc': {
                     'bca': 'bca2',
                     'bcb': 0.5
                   }
           },
           {
             'ba': 'ba3',
             'bb': 1,
             'bc': {
                     'bca': 'bca3',
                     'bcb': 1
                   }
           }
         ]
  },
  ...
]

是否有一个包或类似的包可以在 python 中执行此操作?

显然我可以用一个复杂的循环来做到这一点,但我想知道是否有更有效的方法来做到这一点?

python pandas numpy
1个回答
0
投票

您可以定义一个函数来执行此操作:

下面的函数从字典中提取值,对值进行标准化并替换原始值。第二个功能(不需要以漂亮的方式打印,它只是装饰):

import numpy as np
import json

def normalize_data(data):
    for obj in data:
        bb_values = [item['bb'] for item in obj['b']]
        bcb_values = [item['bc']['bcb'] for item in obj['b']]

        bb_min, bb_max = min(bb_values), max(bb_values)
        bcb_min, bcb_max = min(bcb_values), max(bcb_values)

        normalized_bb = [(bb - bb_min) / (bb_max - bb_min) if bb_max > bb_min else 0 for bb in bb_values]
        normalized_bcb = [(bcb - bcb_min) / (bcb_max - bcb_min) if bcb_max > bcb_min else 0 for bcb in bcb_values]

        for i, item in enumerate(obj['b']):
            item['bb'] = normalized_bb[i]
            item['bc']['bcb'] = normalized_bcb[i]

    return data

data = [
  {
    'a': 'a1',
    'b': [
           {'ba': 'ba1', 'bb': 1, 'bc': {'bca': 'bca1', 'bcb': 4}},
           {'ba': 'ba2', 'bb': 2, 'bc': {'bca': 'bca2', 'bcb': 5}},
           {'ba': 'ba3', 'bb': 3, 'bc': {'bca': 'bca3', 'bcb': 6}}
         ]
  }
]

normalized_data = normalize_data(data)

def print_nicely_formatted_output(data):
    formatted_data = json.dumps(data, indent=4)
    print(formatted_data)

print_nicely_formatted_output(normalized_data)

这给了你

[
    {
        "a": "a1",
        "b": [
            {
                "ba": "ba1",
                "bb": 0.0,
                "bc": {
                    "bca": "bca1",
                    "bcb": 0.0
                }
            },
            {
                "ba": "ba2",
                "bb": 0.5,
                "bc": {
                    "bca": "bca2",
                    "bcb": 0.5
                }
            },
            {
                "ba": "ba3",
                "bb": 1.0,
                "bc": {
                    "bca": "bca3",
                    "bcb": 1.0
                }
            }
        ]
    }
]
© www.soinside.com 2019 - 2024. All rights reserved.