[python] Crear un array numpy de lambdas

No se si es el foro correcto, pero tengo una duda

Estoy intentado crear una array con los siguientes valores

0 | 1, 0, 0
1 | 5, 3, 1

5 | 5, 3, 1
6 | 1, 1, 1

10| 1, 1, 1
11| 1, 3, 5

(último caso, en este caso)
24 | 1, 3, 5


Esta tabla la puedo crear rápidamente con

        self.direct_rewards = np.concatenate( (
                [1, 0, 0],
                np.tile([5, 3, 1], self.nn_top),
                np.tile([1, 1, 1], self.nn_hi-self.nn_top),
                np.tile([1, 3, 5], self.max_number-self.nn_hi) )
                , axis=0).reshape((-1,3))


La idea es que cada columna se corresponde con una acción posible y un estado presente, que es distinto según el tramo de la tabla. Para 0 debe devolver los valores sin mas, pero entre 1 y 5 deben ser eso valores multiplicados por el cociente de dos parámetros, entre 5 y 10 debe devolver 1 si los parámetros son iguales devolver 1, si no cero, y si está por encima de 11, el parámetro multiplicado por el cociente los parámetros invertidos. El tamaño de la tabla podría ser mayor o menor, y los umbrales 5 y 11 también podrían adaptarse.

Mi idea era hacer una matriz con lambdas a las que pasarle los parámetros y que se apañe, quedando la ecuación más limpia…

np.concatenate( (lambda : [1, 0, 0],
                np.tile(lambda x,y: x/y*[5, 3, 1], nn_top),
                np.tile([1, 1, 1], nn_hi-nn_top),
                np.tile(lambda x,y: x/y[1, 3, 5], 24-nn_hi) ),
                axis=0).reshape((-1,3))

pero np.concatenate dice que la matriz es "zero-dimensional" y que me vaya a tomar por culo
tile no me da problemas:
np.tile(lambda x,y: x/y*[5, 3, 1], nn_top)
array([<function <lambda> at 0x7fea33ee6f50>,
       <function <lambda> at 0x7fea33ee6f50>,
       <function <lambda> at 0x7fea33ee6f50>,
       <function <lambda> at 0x7fea33ee6f50>,
       <function <lambda> at 0x7fea33ee6f50>], dtype=object)


¿Alguna idea?


PD: otro problema mas sencillo, tengo un string
array_string = ["uno","dos","tres"])

quiero recuperar el indice en función del parámetro, y en principio debería valer con)
np.where( array_string == "uno" )
-> debería devolver 0, sin embargo devuelve:
(array([], dtype=int64),)

He intentado hacerlo directamente así también, con idéntico resultado.
np.where(datarate_string == datarate_string[1])

Alguna idea?
La primera paso de intentar entenderla xD. La segunda, si sabes que el elemento está en el array:

array_string.index("uno")


Y si no lo sabes, por ejemplo

def findIdx(array, string):
    if array.count(string) > 0:
        return array.index(string)
    else:
        return -1


No he usado where, pero mirando lo que hace no creo que sea para lo que quieres hacer.
Me vale, me vale. Muchas gracias

Lo primero ya se que tiene una pinta complicadilla, pero simplemente quiero llamar a una función tal que

array[i][j](x,y)

y automatizar la creación de ese array por filas.

Edit:

Por cierto que la estaba liando, echando un vistazo paso por paso, tengo que:
b = lambda x,y: x/y*[5,3,1]
b(9,3)
out: [5, 3, 1, 5, 3, 1, 5, 3, 1]


Vamos, que el producto lo que hace es repetir el vector un numero entero de veces, tengo que hacer
b = lambda x,y: np.array([5,3,1]).dot(9/3)

en general

np.concatenate( (lambda : np.array([1, 0, 0]),np.tile(lambda x,y: np.array([5, 3, 1]).dot(x,y), nn_top), lambda x,y: np.tile(np.array([1, 1, 1]).dot(1 if x==y else 0), nn_hi-nn_top), np.tile(lambda x,y: np.array([1, 3, 5]).dot(y/x), 24-nn_hi) ), axis=0).reshape((-1,3))

aunque sigo en lo de zero-dimensional

EDIT 2:

al final lo he resuelto poniendo un [] alrededor de la primera lambda
además he añadido algún 1. para que la división no sea entera (estúpido Python 2)
np.concatenate( [[ lambda x,y: np.array([1, 0, 0.0])],
                        np.tile(lambda x,y: np.array([5, 3, 1.0]).dot(x*1./y), nn_top),
                        np.tile(lambda x,y: np.array([1, 1, 1.0]).dot(1. if x==y else 0.), nn_hi-nn_top),
                        np.tile(lambda x,y: np.array([1, 3, 5.0]).dot(y*1./x), 24-nn_hi) ]
                        , axis=0)


en realidad sigue habiendo un problema, accedería como array[i](x,y)[j], pero bueno, que le den por culo, ya chuta.

Gracias a todos por su colaboración
2 respuestas