Ajout d'une dimension à chaque élément d'un numpy.array
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?
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))