2017-10-18 4 views
1

J'essaye de créer une grille qui liste tous les triplets qui totalisent 1, discrétisés à 0,01. Voici ce que j'ai essayé, sans trop de chance.Créer une grille de triplets

Essayez d'abord

import numpy as np 

w1 = np.arange(0.0, 1.0, 0.01) 
w2 = np.arange(0.0, 1.0, 0.01) 
w3 = np.arange(0.0, 1.0, 0.01) 

x, y,z = np.meshgrid(w1, w2, w3) 

a = np.meshgrid[0:1:100j, 0:1:100j, 0:1:100j] 

Un autre essai:

grid = [] 
for i in range(100): 
    grid.append([]) # Question: now that I have a list of lists, how to fill this with values? 

for entry in grid: 
    entry = ??? 
+0

Comment auriez-vous une grille de triplets? Je veux dire, quels seraient tes deux axes? Est-ce que "triplets = {(0.0, 0.0, 1.0), (0.0, 0.01, 0.99), ...}' serait acceptable? – Adirio

+0

Oui, c'est exactement ça –

Répondre

2

Que diriez-vous de prendre toutes les valeurs possibles de x et y puis calculer ce que la valeur appropriée de z serait:

import itertools 
import numpy as np 

grid = np.array([(x, y, 1.0 - x - y) for (x, y) in 
       itertools.product(np.arange(0, 1.01, 0.01), repeat=2) 
       if x + y <= 1.]) 

Ceci utilise itertools.product pour obtenir le produit cartésien de x et y, bien que np.meshgrid fonctionnerait tout aussi bien.

On peut montrer que les triplets résultant résument à 1 (modulo quelques erreurs d'arrondi):

>>> set(grid.sum(axis=1)) 
{0.99999999999999989, 1.0} 

Voici une version pure numpy de la même approche; J'utilise np.mgrid au lieu de meshgrid parce qu'il me rend un seul tableau au lieu d'un tuple de deux tableaux:

xy = np.mgrid[0:1.01:0.01, 0:1.01:0.01] 
z = 1. - xy.sum(axis=0) 
grid2 = np.concatenate([xy[:, z >= 0.], 
         np.atleast_2d(z[z >= 0.])]) 

est ici le même contrôle de la santé mentale (grid2 est transposés par rapport à grid, c'est leurs formes sont (3, 5151) et (5151, 3), respectivement):

>>> set(grid2.sum(axis=0)) 
{1.0} 
+0

Je peux parfaitement montrer comment ça fonctionne meshgrid? Je me suis tellement penchée sur ça ... –

+0

@EricDuminil bon point! On pourrait juste utiliser 'repeat = 2' sur' itertools.product'. – wildwilhelm

0

Vous n'avez pas besoin d'itérer 100 ** 3 fois. Voici une solution Python simple sans if:

[(x, y, 100 - x - y) for x in range(101) for y in range(101 - x)] 

Il produit:

[(0, 0, 100), (0, 1, 99), (0, 2, 98), (0, 3, 97), (0, 4, 96), (0, 5, 95), (0, 6, 94), (0, 7, 93), (0, 8, 92), (0, 9, 91), ..., (95, 1, 4), (95, 2, 3), (95, 3, 2), (95, 4, 1), (95, 5, 0), (96, 0, 4), (96, 1, 3), (96, 2, 2), (96, 3, 1), (96, 4, 0), (97, 0, 3), (97, 1, 2), (97, 2, 1), (97, 3, 0), (98, 0, 2), (98, 1, 1), (98, 2, 0), (99, 0, 1), (99, 1, 0), (100, 0, 0)] 

Il vous suffit de diviser par 100.0 et mettre les triplets dans un np.array.