Question

I'm trying to transform each element of a numpy array into an array itself (say, to interpret a greyscale image as a color image). In other words:

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

I've tried:

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

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

but get:

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

and I've tried:

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

but get:

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

This is close, but not quite right -- I get an array of objects, not an array of ints.

Update 3! OK. I've realized that my example was too simple beforehand -- I don't just want to replicate my data in a third dimension, I'd like to transform it at the same time. Maybe this is clearer?

Was it helpful?

Solution

Use map to apply your transformation function to each element in 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

OTHER TIPS

Does numpy.dstack do what you want? The first two indexes are the same as the original array, and the new third index is "depth".

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

I propose:

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

You can of course adapt the shape (my_ar.shape[0],)*2 or whatever

Does this do what you want:

tile(my_ar, (1,1,3))
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top