Adicionando uma dimensão a cada elemento de um numpy.array
Pergunta
Eu estou tentando transformar cada elemento de uma matriz numpy em um array (digamos, para interpretar uma imagem em tons de cinza como uma imagem colorida). Em outras palavras:
>>> 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)
Eu tentei:
def my_fun_e(val):
return numpy.array((val, val*2, val*3))
my_fun = numpy.frompyfunc(my_fun_e, 1, 3)
mas 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))
e eu tentei:
my_fun = numpy.frompyfunc(my_fun_e, 1, 1)
mas get:
>>> my_fun(my_ar)
array([[0 0 0], [ 5 10 15], [10 20 30]], dtype=object)
Esta é perto, mas não muito bem -. Eu recebo uma matriz de objetos, e não um array de inteiros
Update 3! OK. Eu percebi que o meu exemplo foi previamente muito simples - eu não só quero replicar meus dados em uma terceira dimensão, eu gostaria de transformá-la ao mesmo tempo. Talvez este seja mais claro?
Solução
Use o mapa para aplicar sua função de transformação em cada elemento em 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
Outras dicas
O numpy.dstack fazer o que quiser? Os dois primeiros índices são o mesmo que a matriz original, e o novo índice de terceira é "profundidade".
>>> 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])
proponho:
numpy.resize(my_ar, (3,3)).transpose()
Pode, claro, adaptar o (my_ar.shape[0],)*2
forma ou qualquer
Será que isso fazer o que quiser:
tile(my_ar, (1,1,3))