Dada uma matriz NumPy de int32
, como eu a converto float32
no local ? Então, basicamente, eu gostaria de fazer
a = a.astype(numpy.float32)
sem copiar a matriz. É grande.
A razão para fazer isso é que eu tenho dois algoritmos para o cálculo de a
. Um deles retorna uma matriz de int32
, o outro retorna uma matriz de float32
(e isso é inerente aos dois algoritmos diferentes). Todos os cálculos adicionais assumem que a
é uma matriz de float32
.
Atualmente eu faço a conversão em uma função C chamada via ctypes
. Existe uma maneira de fazer isso em Python?
ctypes
é tanto "em Python" quanto usarnumpy
. :)Respostas:
Você pode fazer uma exibição com um tipo diferente e copiar no local para a exibição:
rendimentos
Para mostrar que a conversão ocorreu, observe que copiar de
x
paray
alteradox
:impressões
fonte
np.arange(10, dtype=np.int32).view(np.float32)
Numpy 1.8.2, eu receboarray([ 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 tira 10 + 10 float32 e resulta em 10, em vez de 20 float64x.astype(float)
conversão. Eu não o recomendaria, a menos que seu script esteja próximo ao MemoryError.Atualização: Esta função evita a cópia apenas se puder, portanto, essa não é a resposta correta para esta pergunta. a resposta de unutbu é a certa.
numpy astype tem um sinalizador de cópia. Por que não devemos usá-lo?
fonte
Você pode alterar o tipo de matriz sem converter da seguinte maneira:
mas primeiro você precisa alterar todos os números inteiros para algo que será interpretado como a flutuação correspondente. Uma maneira muito lenta de fazer isso seria usar o
struct
módulo python como este:... aplicado a cada membro da sua matriz.
Mas talvez uma maneira mais rápida seria utilizar as ferramentas ctypeslib de numpy (com as quais não estou familiarizado)
- editar -
Como o ctypeslib parece não funcionar, eu prosseguiria com a conversão com o
numpy.astype
método típico , mas prosseguiria em tamanhos de bloco dentro dos limites da sua memória:... altere o dtype quando terminar.
Aqui está uma função que realiza a tarefa para qualquer tipo compatível (que funciona apenas para tipos com itens do mesmo tamanho) e lida com matrizes de forma arbitrária com controle do usuário sobre o tamanho do bloco:
fonte
a.view(numpy.float32)
. A parte difícil é realmente converter os dados.numpy.ctypeslib
apenas ajuda a reinterpretar os dados, não a convertê-los.use view () e o parâmetro 'dtype' para alterar a matriz no lugar.
fonte
int
, essa resposta só reinterpretaria os dados existentes como um tipo diferente, o que não era o que eu estava pedindo.dtype
,order
esubok
requisitos para retornar uma cópia da matriz? Eu não resolvo isso.Usa isto:
fonte
a = np.subtract(a, 0., dtype=np.float32)
fonte
numpy.subtract
está retornando uma cópia, não é? Somente o nome foia
reutilizado para outro pedaço de dados ... Por favor, explique se estou errado sobre isso.