Creando una matriz NumPy directamente desde __array_interface__

Supongamos que tengo un diccionario __array_interface__ y me gustaría crear una vista numérica de estos datos desde el propio diccionario. Por ejemplo:

 buff = {'shape': (3, 3), 'data': (140546686381536, False), 'typestr': '<f8'} view = np.array(buff, copy=False) 

Sin embargo, esto no funciona como np.array busca la interfaz de búfer o matriz como atributos. La solución simple podría ser la siguiente:

 class numpy_holder(object): pass holder = numpy_holder() holder.__array_interface__ = buff view = np.array(holder, copy=False) 

Esto parece un poco rotundo. ¿Me estoy perdiendo una manera directa de hacer esto?

Corrección: con el valor correcto de ‘datos’, su holder trabaja en np.array :

np.array definitivamente no va a funcionar ya que espera una iterable, algunas cosas como una lista de listas, y analiza los valores individuales.

Hay un constructor de bajo nivel, np.ndarray que toma un parámetro de búfer. Y un np.frombuffer .

Pero mi impresión es que x.__array_interface__['data'][0] es una representación entera de la ubicación del búfer de datos, pero no directamente un puntero al búfer. Solo lo he usado para verificar que una vista comparte el mismo dúfer de datos, no para construir nada a partir de él.

np.lib.stride_tricks.as_strided usa __array_interface__ para los datos de zancada y forma predeterminados, pero obtiene los datos de una matriz, no del diccionario __array_interface__ .

===========

Un ejemplo de ndarray con un atributo .data :

 In [303]: res Out[303]: array([[ 0, 20, 50, 30], [ 0, 50, 50, 0], [ 0, 0, 75, 25]]) In [304]: res.__array_interface__ Out[304]: {'data': (178919136, False), 'descr': [('', ' In [306]: np.ndarray(buffer=res.data, shape=(4,3),dtype=int) Out[306]: array([[ 0, 20, 50], [30, 0, 50], [50, 0, 0], [ 0, 75, 25]]) In [324]: np.frombuffer(res.data,dtype=int) Out[324]: array([ 0, 20, 50, 30, 0, 50, 50, 0, 0, 0, 75, 25]) 

Ambas de estas matrices son vistas.

Bien, con su clase de holder , puedo hacer lo mismo, usando este res.data como el búfer de datos. Su clase crea un object exposing the array interface .

 In [379]: holder=numpy_holder() In [380]: buff={'data':res.data, 'shape':(4,3), 'typestr':'