2016-08-16 5 views
0

Ich möchte ein System von Gleichungen lösen durch linalg.solve (A, b) Lösen Sie eine lineare Matrixgleichung oder ein System von linearen skalaren Gleichungen von scipy.org. Insbesondere habe ich zwei Wörterbücher, dict1 und dict1, und ich muss sie in Matrizen konvertieren, um das obige Skript zu verwenden.Erstellen einer Matrix einer bestimmten Größe aus einem Wörterbuch

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}) 

Das gibt mir:

{'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}} 

ich dies in eine 4 x 4 Matrix umwandeln möchte, da ich Lebensmittel bin mit 4 Arten von. Ich habe dict2 nicht eingefügt, sobald ich herausgefunden habe, wie man mit einem Wörterbuch in eine Matrix konvertiert, ich kann das andere tun, aber wenn du es brauchst, kann ich es aktualisieren.

Ich bin neu bei Python und wollte mit Wörterbüchern und dem Matrix-Solver umgehen :). Es war einfach, das mit Arrays zu tun, aber jetzt möchte ich sehen, wie ich vorgehen kann, wenn ich Wörterbücher habe.

+0

können Sie ein Beispiel geben, um zu verstehen, was Sie meinen, indem Sie es in 4x4 Matrix umwandeln? Und welches System versuchen Sie zu lösen? –

+0

Während der Permutation und Kombination sollten Sie zur besseren Lesbarkeit "V" oder einen Unterstrich verwenden. – kmario23

Antwort

2

Sie können eine numpy Array aus dem Wörterbuch mit Listenkomprehensionen erstellen:

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]) 

Diese Sie geben:

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]]]) 

Dies ist ein 4x4x2-Array:

> A.shape 
(4, 4, 2) 

Dann , um eine 4x4-Matrix der daily Werte und die rarely v Verwenden Sie numpy's Advanced Slicing separat. Im Gegensatz zu Python-Listen können numpy Arrays auf mehrere Dimensionen gleichzeitig aufgeteilt werden. Dies geschieht durch Platzieren eines Slice-Objekts (zB: 3 :, 0, :) innerhalb der Klammern für jede Dimension des Arrays, getrennt durch Kommas. Unser Array, A, hat drei Dimensionen:

> A.ndim 
3 

Die dritte Dimension zeigt an, ob ein Wert "täglich" (0) oder "selten" (1) ist. Um also alle Tageswerte zu erhalten, wollen wir alle Zeilen (:), alle Spalten (:) und nur den ersten Eintrag in der dritten Dimension (0). Mit erweiterten Aufschneiden des numpy, separte wir gerade die Scheibe wir für jede Dimension wollen mit Komma:

> 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]]) 

Wenn Sie die Bedeutung dieser Werte deutlicher machen möchten, können Sie die numpy Arrays zu einem Pandas Datenrahmen umwandeln:

> 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 

Weitere Informationen zum erweiterten Slicing finden Sie unter http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced-indexing.

+0

Danke schön. Genau das habe ich gesucht. Ich fühle, dass ich als Anfänger immer noch die Grundlagen lerne, bevor ich zu Pandas übergehen kann. Danke für das Pandabeispiel! Ich freue mich darauf, bald Pandas zu lernen. –

+0

Kannst du bitte das fortgeschrittene Slicen erklären? Ich habe Probleme zu verstehen, wie das eine 4x4-Matrix erzeugt. –

+0

Ich habe meine Antwort aktualisiert, um mehr über das erweiterte Slicing zu erfahren. – mohrtw

Verwandte Themen