5

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?

4 Answers 4

7

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])
Sign up to request clarification or add additional context in comments.

1 Comment

Note that numpy.dstack operates on 3rd dimension explicitly. It is also supported for backward compatibility. Using numpy.stack is preferred.
2

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

Comments

1

I propose:

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

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

Comments

1

Does this do what you want:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.