2017-09-08 2 views
2

J'ai un tuple qui contient plusieurs tuples. Chaque tuple dans mon tuple principal a deux éléments - le premier élément est un tableau avec une forme de (700,) et le deuxième élément est un nombre entier.concaténation de tuples de tableau dans un tuple

Voici une petite représentation de mon tuple:

x =((np.array[3,3,3],1), (np.array[4,4,4],2), (np.array[5,5,5],3)) 

Je cherche à combiner tous les tableaux dans une grande matrice, et tous les entiers dans un vecteur de colonne, qui sont tous regroupés dans un tuple.

Donc, ma sortie doit être quelque chose comme ceci:

y= (np.array([[3,3,3],[4,4,4], [5,5,5]]), np.array([1,2,3])) 

Un tuple avec le premier élément comme un tableau avec la forme (3,3), et le second élément comme un tableau avec une forme de (3,)

Je suppose que nous pouvons utiliser l'une des méthodes de pile de numpy mais je ne peux pas envelopper ma tête autour de la façon d'accéder à tous les éléments des tuples pour le faire.

Merci.

+0

Ainsi, la sortie serait un tableau en forme de 3x4 régulière, non? – Divakar

+0

Non, la sortie serait un tuple avec deux tableaux - 3x3 et 3. J'espère que cela a du sens. – Moondra

+0

Pourriez-vous écrire la sortie attendue réelle, car ce que vous avez montré n'est pas valide. – Divakar

Répondre

3
>>> x = ((np.array([3,3,3]),1), (np.array([4,4,4]),2), (np.array([5,5,5]),3)) 
>>> y = (np.array([e for e, _ in x]), np.array([i for _, i in x])) 
(array([[3, 3, 3], 
     [4, 4, 4], 
     [5, 5, 5]]), array([1, 2, 3])) 

Ou, sans compréhensions:

>>> map(np.array, zip(*x)) 
[array([[3, 3, 3], 
     [4, 4, 4], 
     [5, 5, 5]]), array([1, 2, 3])] 
+0

La carte fonctionne brillamment ici, +1. Je vais supprimer ma réponse puisque l'OP a changé son exemple de listes en tableaux. –

+0

Une version de compréhension de liste de 'map':' [np.array (i) pour i dans zip (* x)] '. La clé est que 'zip (* x)' est effectivement une liste 'transpose'. – hpaulj

1

Une approche de tableau structuré:

D'abord le tuple, avec la syntaxe corrigée:

In [392]: x =((np.array([3,3,3]),1), (np.array([4,4,4]),2), (np.array([5,5,5]),3)) 

entrée à un tableau structuré est une liste de tuples, chaque tuple contenant des données pour un record:

In [393]: arr=np.array(list(x), np.dtype('3i,i')) 
In [394]: arr 
Out[394]: 
array([([3, 3, 3], 1), ([4, 4, 4], 2), ([5, 5, 5], 3)], 
     dtype=[('f0', '<i4', (3,)), ('f1', '<i4')]) 

Accès au tableau par nom de champ:

In [395]: arr['f0'] 
Out[395]: 
array([[3, 3, 3], 
     [4, 4, 4], 
     [5, 5, 5]], dtype=int32) 
In [396]: arr['f1'] 
Out[396]: array([1, 2, 3], dtype=int32) 

ou un tuple de champs:

In [397]: (arr['f0'], arr['f1']) 
Out[397]: 
(array([[3, 3, 3], 
     [4, 4, 4], 
     [5, 5, 5]], dtype=int32), array([1, 2, 3], dtype=int32))