Pregunta

Estoy tratando de transformar cada elemento de una matriz numpy en una matriz misma (por ejemplo, para interpretar una imagen en escala de grises como una imagen en color). En otras palabras:

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

He intentado:

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

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

pero obtén:

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

y he intentado:

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

pero obtén:

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

Esto está cerca, pero no del todo bien: obtengo una matriz de objetos, no una matriz de int.

Actualización 3! OK. Me di cuenta de que mi ejemplo era demasiado simple de antemano: no solo quiero replicar mis datos en una tercera dimensión, me gustaría transformarlos al mismo tiempo. ¿Quizás esto es más claro?

¿Fue útil?

Solución

Use el mapa para aplicar su función de transformación a cada elemento en 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

Otros consejos

¿Numpy.dstack hace lo que quieres? Los dos primeros índices son los mismos que la matriz original, y el nuevo tercer índice es "profundidad".

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

Propongo:

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

Por supuesto, puede adaptar la forma (my_ar.shape [0],) * 2 o lo que sea

¿Esto hace lo que quieres?

tile(my_ar, (1,1,3))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top