es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Currying el tipo ndarray de NumPy.

Numpy acaba de lanzar el soporte para escribir con tipos en la versión 1.22.0. La clase ndarray acepta dos parámetros: forma y tipo de datos. Me gustaría envolver el ndarray y solo requerir que se especifique el tipo de datos. ¿Existe alguna manera de hacer esto?

from typing import Generic, TypeVar, Any
import numpy as np

T = TypeVar('T')
class NDArrayAnyShape(np.ndarray[Any, Generic[T]]):
    ...

NDArrayAnyShapeIntDtype = NDArrayAnyShape[int]

Esto arroja el siguiente error:

TypeError: Demasiados pocos argumentos para NDArrayAnyShape
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de hacer esto. Puede crear una clase genérica NDArrayAnyShape que acepte un parámetro de tipo T que representa el tipo de datos, y use Any para el parámetro de forma. Aquí tienes un ejemplo:

    from typing import TypeVar, Generic
    import numpy as np
    
    T = TypeVar('T')
    
    class NDArrayAnyShape(np.ndarray, Generic[T]):
        def __new__(cls, data: np.ndarray) -> 'NDArrayAnyShape':
            return data.view(cls)
    
        def __init__(self, data: np.ndarray) -> None:
            self.data: np.ndarray = data
    
        @property
        def dtype(self) -> np.dtype:
            return self.data.dtype
    
        @property
        def shape(self) -> Any:
            return self.data.shape
    

    Esta clase acepta una instancia de np.ndarray en su constructor y devuelve un nuevo objeto de la clase NDArrayAnyShape que lo envuelve. El método __new__ se utiliza para crear este nuevo objeto, y el método view se utiliza para asegurarse de que el objeto tenga la clase correcta. También definimos las propiedades dtype y shape para hacer que el objeto sea compatible con la clase np.ndarray.

    Luego puedes usar esta clase de la siguiente manera:

    NDArrayAnyShapeIntDtype = NDArrayAnyShape[int](np.array([1, 2, 3], dtype=np.int32))
    

    Esto crea una nueva instancia de NDArrayAnyShape con un tipo de datos int y cualquier forma (como se especifica mediante el tipo Any).

Comments are closed.