2008-11-21 5 views
4

Я пытаюсь преобразовать каждый элемент массива numpy в сам массив (скажем, для интерпретации изображения в оттенках серого как цветное изображение). Другими словами:Добавление измерения к каждому элементу numpy.array

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

Я пробовал:

def my_fun_e(val): 
    return numpy.array((val, val*2, val*3)) 

my_fun = numpy.frompyfunc(my_fun_e, 1, 3) 

но получить:

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

и я попытался:

my_fun = numpy.frompyfunc(my_fun_e, 1, 1) 

но получить:

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

Это близко, но не совсем верно - я получаю массив объектов, а не массив ints.

Обновление 3! ОК. Я понял, что мой пример был слишком прост заранее - я не просто хочу реплицировать свои данные в третьем измерении, я бы хотел преобразовать его в одно и то же время. Может быть, это яснее?

ответ

1

Используйте карту, чтобы применить функцию преобразования для каждого элемента в 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 
1

Я предлагаю:

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

Вы можете, конечно, адаптировать форму (my_ar.shape[0],)*2 или любой

1

ли это делать то, что вы хотите:

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

ли numpy.dstack делать то, что вы хотите ? Первые два индекса совпадают с исходным массивом, а новый третий индекс - «глубина».

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

Обратите внимание, что `numpy.dstack` работает на 3-е измерение в явном виде. Он также поддерживается для обратной совместимости. Использование [numpy.stack] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.stack.html) является предпочтительным. – johndodo 2017-05-20 15:15:52

Смежные вопросы