给定int32
的NumPy数组,如何将其转换为float32
in place?所以基本上,我想做的是
a = a.astype(numpy.float32)
而不复制数组。它很大。
这样做的原因是我有两种算法来计算a
。其中一个返回int32
数组,另一个返回float32
数组(这是两种不同算法所固有的)。所有进一步的计算都假设a
是一个float32
数组。
目前,我在一个名为ctypes
的C函数中进行转换。有没有办法在Python中做到这一点?
发布于 2010-12-09 16:31:04
可以创建具有不同数据类型的视图,然后将其在位复制到视图中:
import numpy as np
x = np.arange(10, dtype='int32')
y = x.view('float32')
y[:] = x
print(y)
收益率
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.], dtype=float32)
要显示转换已就地进行,请注意,从x
复制到y
会更改x
print(x)
打印
array([ 0, 1065353216, 1073741824, 1077936128, 1082130432,
1084227584, 1086324736, 1088421888, 1090519040, 1091567616])
发布于 2012-05-17 00:29:42
更新:此函数仅在可能的情况下避免复制,因此这不是此问题的正确答案。unutbu's answer是正确的选择。
a = a.astype(numpy.float32, copy=False)
numpy astype有一个复制标志。为什么我们不能使用它呢?
发布于 2010-12-09 00:59:50
您可以更改数组类型而不进行转换,如下所示:
a.dtype = numpy.float32
但首先,您必须将所有整数更改为将被解释为相应的浮点数的值。一种非常慢的方法是使用python的struct
模块,如下所示:
def toi(i):
return struct.unpack('i',struct.pack('f',float(i)))[0]
...applied到数组中的每个成员。
但也许更快的方法是使用numpy的ctypeslib工具(我不熟悉)。
编辑- -
由于ctypeslib似乎不起作用,那么我将继续使用典型的numpy.astype
方法进行转换,但在内存限制内继续进行块大小的转换:
a[0:10000] = a[0:10000].astype('float32').view('int32')
...then完成后更改数据类型。
下面是一个函数,它可以完成任何兼容数据类型的任务(只适用于具有相同大小项的数据类型),并通过用户控制块大小来处理任意形状的数组:
import numpy
def astype_inplace(a, dtype, blocksize=10000):
oldtype = a.dtype
newtype = numpy.dtype(dtype)
assert oldtype.itemsize is newtype.itemsize
for idx in xrange(0, a.size, blocksize):
a.flat[idx:idx + blocksize] = \
a.flat[idx:idx + blocksize].astype(newtype).view(oldtype)
a.dtype = newtype
a = numpy.random.randint(100,size=100).reshape((10,10))
print a
astype_inplace(a, 'float32')
print a
https://stackoverflow.com/questions/4389517
复制相似问题