我想通过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 x 4矩阵,因为我使用的是4种食物。我没有把dict2作为一次我弄清楚如何转换为一个字典的矩阵,我可以做另一个,但如果你需要它,我可以更新。
我是Python新手,想要使用字典和矩阵求解器:)。使用数组很容易做到,但现在我想知道如果我有字典怎么办。
答案 0 :(得分: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
值和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数组转换为pandas DataFrame:
> 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。