Frage

Ich versuche, jedes Element einer numpy Array in ein Array selbst zu verwandeln (sagen wir, ein Graustufenbild als ein Farbbild zu interpretieren). Mit anderen Worten:

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

Ich habe versucht:

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

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

aber erhalten:

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

und ich habe versucht:

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

aber erhalten:

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

Das ist in der Nähe, aber nicht ganz richtig. - Ich ein Array von Objekten zu erhalten, nicht ein Array von ints

3 Aktualisieren Sie! OK. Ich habe erkannt, dass mein Beispiel zu einfach vorher war - ich nicht nur meine Daten in einer dritten Dimension replizieren will, ich mag es zur gleichen Zeit zu transformieren. Vielleicht ist dies klarer?

War es hilfreich?

Lösung

Mit der Karte auf Ihre Transformationsfunktion für jedes Element in my_ar gelten:

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

Andere Tipps

Ist numpy.dstack tun, was Sie wollen? Die ersten beiden Indizes sind die gleichen wie die ursprüngliche Anordnung, und der neue dritte Index „Tiefe“.

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

Ich schlage vor:

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

Sie können die Form (my_ar.shape[0],)*2 natürlich anpassen oder was auch immer

Ist das tun, was Sie wollen:

tile(my_ar, (1,1,3))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top