Dada una matriz NumPy de int32
, ¿cómo la convierto float32
en su lugar ? Básicamente, me gustaría hacer
a = a.astype(numpy.float32)
sin copiar la matriz. Es grande.
La razón para hacer esto es que tengo dos algoritmos para el cálculo de a
. Uno de ellos devuelve una matriz de int32
, el otro devuelve una matriz de float32
(y esto es inherente a los dos algoritmos diferentes). Todos los cálculos adicionales suponen que a
es una matriz de float32
.
Actualmente hago la conversión en una función C llamada vía ctypes
. ¿Hay alguna manera de hacer esto en Python?
ctypes
es tanto "en Python" como usarnumpy
. :)Respuestas:
Puede crear una vista con un tipo diferente y luego copiar in situ en la vista:
rendimientos
Para mostrar la conversión estaba en el lugar, nota que la copia de
x
aly
alteradax
:huellas dactilares
fuente
np.arange(10, dtype=np.int32).view(np.float32)
en Numpy 1.8.2, me salearray([ 0.00000000e+00, 1.40129846e-45, ... [snip] ... 1.26116862e-44], dtype=float32)
.y[:] = x
.a = np.arange(10, dtype='float32'); b = a[::-1]; c = np.vstack((a,b)); d = c.view('float64')
este código toma 10 + 10 float32 y da como resultado 10, en lugar de 20 float64x.astype(float)
conversión. No lo recomendaría a menos que su script esté bordeando MemoryError.Actualización: esta función solo evita la copia si puede, por lo tanto, esta no es la respuesta correcta para esta pregunta. La respuesta de unutbu es la correcta.
Astype numpy tiene una bandera de copia. ¿Por qué no deberíamos usarlo?
fuente
Puede cambiar el tipo de matriz sin convertir así:
pero primero debe cambiar todos los enteros a algo que se interpretará como el flotante correspondiente. Una forma muy lenta de hacer esto sería usar el
struct
módulo de Python como este:... aplicado a cada miembro de su matriz.
Pero quizás una forma más rápida sería utilizar las herramientas ctypeslib de numpy (con las que no estoy familiarizado)
- editar -
Como ctypeslib no parece funcionar, entonces procedería con la conversión con el
numpy.astype
método típico , pero procedería en tamaños de bloque que estén dentro de los límites de su memoria:... luego cambie el dtype cuando haya terminado.
Aquí hay una función que realiza la tarea para cualquier tipo de dt compatible (solo funciona para dtypes con elementos del mismo tamaño) y maneja matrices de forma arbitraria con control del usuario sobre el tamaño del bloque:
fuente
a.view(numpy.float32)
. La parte difícil es realmente convertir los datos.numpy.ctypeslib
solo ayuda a reinterpretar los datos, no a convertirlos realmente.use view () y el parámetro 'dtype' para cambiar la matriz en su lugar.
fuente
int
, esta respuesta solo reinterpretaría los datos existentes como un tipo diferente, que no es lo que estaba pidiendo.dtype
,order
ysubok
los requisitos para devolver una copia de la matriz? No lo resuelvoUtilizar este:
fuente
a = np.subtract(a, 0., dtype=np.float32)
fuente
numpy.subtract
está devolviendo una copia, ¿no? Solo el nombrea
reutilizado para otra porción de datos ... Por favor explique, si estoy equivocado sobre esto.