2016-08-16 75 views
0

我想通过linalg.solve(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,想玩玩字典和矩阵求解:)。使用数组很容易,但是现在我想看看如果我有字典,该怎么办。

+0

你能举一个例子来理解你的意思吗?将它转换为4x4矩阵?你试图解决什么系统? –

+0

在进行排列组合时,应考虑使用“V”或下划线以提高可读性。 – kmario23

回答

2

可以使用列表解析创建从词典中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]]]) 

这是一个4x4x2数组:

> A.shape 
(4, 4, 2) 

然后,得到daily值的4x4矩阵和rarelyv分开使用,使用numpy的高级切片。 与Python列表不同,numpy数组可以一次切割多个维度。这是通过在括号内为数组的每个维放置一个切片对象(例如:3 :, 0,:),并用逗号分隔来完成的。 我们阵列,A,具有三个维度:

> A.ndim 
3 

第三维指示值是否为 “每日”(0)或 “很少”(1)。因此,要获得所有日常值,我们需要所有行(:),所有列(:),并且只有第三维(0)中的第一个条目。随着numpy的先进的切片,我们只是separte我们希望切片用逗号每个维度:

> 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

+0

谢谢。这正是我所期待的。我觉得作为一个初学者,在我可以转向熊猫之前,我仍然在学习基础知识。不过谢谢你的熊猫榜样!我期待很快学习熊猫。 –

+0

你能解释一下预先切片吗?我无法理解如何创建4x4矩阵。 –

+0

我更新了我的答案,以了解关于高级切片的更多细节。 – mohrtw