2008-11-21 11 views
4

J'essaie de transformer chaque élément d'un tableau numpy en un tableau lui-même (par exemple, pour interpréter une image en niveaux de gris en tant qu'image couleur). En d'autres termes:Ajout d'une dimension à chaque élément d'un fichier numpy.array

>>> my_ar = numpy.array((0,5,10)) 
[0, 5, 10] 
>>> transformed = my_fun(my_ar) # In reality, my_fun() would do something more useful 
array([ 
     [ 0, 0, 0], 
     [ 5, 10, 15], 
     [10, 20, 30]]) 
>>> transformed.shape 
(3, 3) 

J'ai essayé:

def my_fun_e(val): 
    return numpy.array((val, val*2, val*3)) 

my_fun = numpy.frompyfunc(my_fun_e, 1, 3) 

mais je reçois:

my_fun(my_ar) 
(array([[0 0 0], [ 5 10 15], [10 20 30]], dtype=object), array([None, None, None], dtype=object), array([None, None, None], dtype=object)) 

et j'ai essayé:

my_fun = numpy.frompyfunc(my_fun_e, 1, 1) 

mais je reçois:

>>> my_fun(my_ar) 
array([[0 0 0], [ 5 10 15], [10 20 30]], dtype=object) 

Ceci est proche, mais pas tout à fait raison - je reçois un tableau d'objets, pas un tableau d'ints.

Mise à jour 3! OK. J'ai réalisé que mon exemple était trop simple à l'avance - je ne veux pas simplement répliquer mes données dans une troisième dimension, je voudrais les transformer en même temps. Peut-être que c'est plus clair?

Répondre

1

carte Utilisez pour appliquer votre fonction de transformation à chaque élément my_ar:

import numpy 

my_ar = numpy.array((0,5,10)) 
print my_ar 

transformed = numpy.array(map(lambda x:numpy.array((x,x*2,x*3)), my_ar)) 
print transformed 

print transformed.shape 
1

Je propose:

numpy.resize(my_ar, (3,3)).transpose() 

Vous pouvez d'adapter naturellement la forme (my_ar.shape[0],)*2 ou quoi que

1

Est-ce ce que vous voulez:

tile(my_ar, (1,1,3)) 
6

Est-ce que numpy.dstack faire ce que vous voulez ? Les deux premiers index sont les mêmes que le tableau d'origine, et le nouveau troisième index est "profondeur".

>>> import numpy as N 
>>> a = N.array([[1,2,3],[4,5,6],[7,8,9]]) 
>>> a 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 
>>> b = N.dstack((a,a,a)) 
>>> b 
array([[[1, 1, 1], 
     [2, 2, 2], 
     [3, 3, 3]], 

     [[4, 4, 4], 
     [5, 5, 5], 
     [6, 6, 6]], 

     [[7, 7, 7], 
     [8, 8, 8], 
     [9, 9, 9]]]) 
>>> b[1,1] 
array([5, 5, 5]) 
+0

Notez que 'numpy.dstack' fonctionne sur 3ème dimension explicitement. Il est également pris en charge pour la rétrocompatibilité. L'utilisation de [numpy.stack] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.stack.html) est préférable. – johndodo