Как из составного словаря с списком данных (values) создать многомерную матрицу (mxn)?

У меня есть составной словарь, в котором первый ключ key1 (тип группы) ведет к списку ключей key2 (выборка группы), которые содержат одномерный массив данных values, уникальный для каждой выборки. Мне нужно записать функцию, которая бы обращалась сначала к словарю ключу 1, потом из словаря 2 брала бы одномерный массив данных преобразовала бы в многомерную матрицу (mxn), где n столбцов - это количество ключей, каждому из которых соответствует свой уникальный массив данных m

Пример данных: 1dict: HC, ASD (2 groups) 2 dict: ASD (2 samples with values) , HC (2 samples with values) {'HC': {'01': array([0.72919255, 0.68225476, 0.46834589, ..., 0.71843863, 0.73399546, 0.81451451]), '02': array([0.31245597, 0.36639732, 0.36188738, ..., 0.53902941, 0.46416973, 0.54336855])}, ''ASD': {'03': array([0.60228325, 0.61171438, 0.02307892, ..., 0.41093266, 0.46532123, 0.56890823]), '04': array([0.44370506, 0.58574023, 0.21442585, ..., 0.38181173, 0.62737836, 0.68650757])}}

А надо как-то так: Total_matrix = np.array((01,02,03,04)) ASDTOTAL.shape (4,100)"

Вот то, что я написала. В последней строчке эта не знаю какая мистическая функция, которая бы объединяла бы матрицы.

def mds(tr_dict):
    from sklearn.manifold import MDS
    iu1 = np.triu_indices(100,1)
    mds_dict = dict()
    
    for (data_type,data_set) in tr_dict.items():
        mds_dict[data_type] = dict()
        for (data_type,data_set) in tr_dict.items():
            for (ind, array_1_dim) in data_set.items():
                mds = MDS(random_state=0)
                mds_dict[data_type][ind] = mds.fit_transform(array_1_dim)
    return mds_dict 
    sum_array = mystery(sum_before, next_element)

Есть идеи?

Спасибо


Ответы (1 шт):

Автор решения: Pak Uula

Признаюсь, я не понял про ключи первого типа и второго типа. Поэтому в решении я покажу, как собрать массивы Total_matrix и ASDTOTAL из словаря с ключами HC и ASD.

Главный фокус в этом решении - объединение списков функцией sum. Например, sum([['01', '02'], ['03','04'], []) работает так:

  • Сначала вычисляется сумма [] + ['01', '02'], что равно ['01', '02']
  • Затем вычисляется сумма ['01', '02'] + ['03','04'], что равно ['01', '02', '03','04']
  • То есть получили объединение списков.

Для примера я генерирую случайные массивы длиной 100.

group_keys = ['HC', 'ASD']
data = {'HC': {'01': np.random.rand(100), '02': np.random.rand(100)},
        'ASD': {'03': np.random.rand(100), '04': np.random.rand(100)}
       }

Сначала получим список словарей со значениями: group_dicts = [data[grp] for grp in group_keys]

Теперь получим список ключей этих словарей и построим Total_matrix:

item_keys = sum([list(d.keys()) for d in group_dicts], [])
Total_matrix = np.array(item_keys)

Следующий шаг - сделать список списков значений: item_list = sum([list(d.values()) for d in group_dicts], [])

Теперь магическая функция numpy.vstack соберёт из item_list двумерную матрицу:

ASDTOTAL = np.vstack(item_list)

ASDTOTAL.shape равно (4, 100), что и требовалось получить.

→ Ссылка