Question

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 comme une image couleur). En d'autres termes:

>>> 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 obtenez:

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 obtenez:

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

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

Mise à jour 3! OK. Je me suis rendu compte que mon exemple était trop simple auparavant. Je ne veux pas seulement reproduire mes données dans une troisième dimension, je voudrais les transformer en même temps. Peut-être que cela est plus clair?

Était-ce utile?

La solution

Utilisez la carte pour appliquer votre fonction de transformation à chaque élément de 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

Autres conseils

numpy.dstack fait-il ce que vous voulez? Les deux premiers index sont les mêmes que ceux du tableau d'origine et le nouvel 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])

Je propose:

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

Vous pouvez bien sûr adapter la forme (my_ar.shape [0],) * 2 ou autre chose

Est-ce que cela fait ce que vous voulez:

tile(my_ar, (1,1,3))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top