从字典中创建一定大小的矩阵

2024-09-30 05:24:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想通过线性求解(A,b)解线性矩阵方程或线性标量方程组scipy.org网站. 具体来说,我有两个字典,dict1和dict1,为了使用上面的脚本,我需要将它们转换成矩阵。你知道吗

 food = ['fruits', 'vegetables', 'bread', 'meat']
 frequency = ['daily', 'rarely']
 consumptions = {'fruits': {'daily': 6, 'rarely': 4}, 'vegetables': {'daily': 8, 'rarely': 6}, 'bread': {'daily': 2, 'rarely': 1}, 'meat': {'daily': 2, 'rarely': 1}}

dict1 = {}
for f in food: #type of food
    for j in food: 
        dict2 = {}
        total = 0.
        for q in frequency:
            dict2.update({q:(consumptions.get(j).get(q)*consumptions.get(f).get(q))}) 
            key = f+'v'+j #comparing the different foods
         dict1.update({key:dict2})

这给了我:

{'breadvbread': {'daily': 4, 'rarely': 1},
'breadvfruits': {'daily': 12, 'rarely': 4},
'breadvmeat': {'daily': 4, 'rarely': 1},
'breadvvegetables': {'daily': 16, 'rarely': 6},
'fruitsvbread': {'daily': 12, 'rarely': 4},
'fruitsvfruits': {'daily': 36, 'rarely': 16},
'fruitsvmeat': {'daily': 12, 'rarely': 4},
'fruitsvvegetables': {'daily': 48, 'rarely': 24},
'meatvbread': {'daily': 4, 'rarely': 1},
'meatvfruits': {'daily': 12, 'rarely': 4},
'meatvmeat': {'daily': 4, 'rarely': 1},
'meatvvegetables': {'daily': 16, 'rarely': 6},
'vegetablesvbread': {'daily': 16, 'rarely': 6},
'vegetablesvfruits': {'daily': 48, 'rarely': 24},
'vegetablesvmeat': {'daily': 16, 'rarely': 6},
'vegetablesvvegetables': {'daily': 64, 'rarely': 36}}

我想把它转换成一个4×4的矩阵,因为我用的是4种食物。我没有把dict2当我知道如何转换成一个矩阵与一个字典,我可以做其他,但如果你需要它,我可以更新。你知道吗

我是Python新手,想玩玩字典和矩阵解算器:)。使用数组很容易做到,但是现在我想看看如果我有字典怎么做。你知道吗


Tags: inforget字典food线性矩阵daily
1条回答
网友
1楼 · 发布于 2024-09-30 05:24:30

可以使用列表理解从字典创建numpy数组:

import numpy as np

A = np.array([[(consumptions[x]["daily"]*consumptions[y]["daily"],
                  consumptions[x]["rarely"]*consumptions[y]["rarely"])
                  for y in food]
                  for x in food])

这将为您提供:

array([[[36, 16],
        [48, 24],
        [12,  4],
        [12,  4]],

       [[48, 24],
        [64, 36],
        [16,  6],
        [16,  6]],

       [[12,  4],
        [16,  6],
        [ 4,  1],
        [ 4,  1]],

       [[12,  4],
        [16,  6],
        [ 4,  1],
        [ 4,  1]]])

这是一个4x2阵列:

> A.shape
(4, 4, 2)

然后,要分别获得daily值和rarely值的4x4矩阵,请使用numpy的高级切片。 与Python列表不同,numpy数组可以同时在多个维度上进行切片。这是通过将一个切片对象(例如:3:,0,:)放置在数组每个维度的方括号内,用逗号分隔来完成的。 我们的数组A有三个维度:

> A.ndim
3

第三个维度表示值是“每日”(0)还是“很少”(1)。所以要得到所有的每日值,我们需要所有的行(:),所有的列(:),并且只需要第三维中的第一个条目(0)。使用numpy的高级切片,我们只需用逗号分隔每个维度所需的切片:

> daily = A[:, :, 0]
> daily

array([[36, 48, 12, 12],
       [48, 64, 16, 16],
       [12, 16,  4,  4],
       [12, 16,  4,  4]])


> rarely = A[:, :, 1]
> rarely

array([[16, 24,  4,  4],
       [24, 36,  6,  6],
       [ 4,  6,  1,  1],
       [ 4,  6,  1,  1]])

如果要使这些值的含义更明确,可以将numpy数组转换为数据帧:

> import pandas as pd

> df = pd.DataFrame(daily, columns=food, index=food)
> df

            fruits  vegetables  bread   meat
fruits      36      48          12      12
vegetables  48      64          16      16
bread       12      16          4       4
meat        12      16          4       4

有关高级切片的详细信息,请参见http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced-indexing。你知道吗

相关问题 更多 >

    热门问题