简体   繁体   中英

Adding a dimension to every element of a numpy.array

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.

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?

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

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

I propose:

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

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

这样做你想要的:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM