首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NumPy数组的就地类型转换

NumPy数组的就地类型转换
EN

Stack Overflow用户
提问于 2010-12-09 00:01:47
回答 7查看 134.5K关注 0票数 137

给定int32的NumPy数组,如何将其转换为float32 in place?所以基本上,我想做的是

代码语言:javascript
复制
a = a.astype(numpy.float32)

而不复制数组。它很大。

这样做的原因是我有两种算法来计算a。其中一个返回int32数组,另一个返回float32数组(这是两种不同算法所固有的)。所有进一步的计算都假设a是一个float32数组。

目前,我在一个名为ctypes的C函数中进行转换。有没有办法在Python中做到这一点?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-12-09 16:31:04

可以创建具有不同数据类型的视图,然后将其在位复制到视图中:

代码语言:javascript
复制
import numpy as np
x = np.arange(10, dtype='int32')
y = x.view('float32')
y[:] = x

print(y)

收益率

代码语言:javascript
复制
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.], dtype=float32)

要显示转换已就地进行,请注意,从x复制到y会更改x

代码语言:javascript
复制
print(x)

打印

代码语言:javascript
复制
array([         0, 1065353216, 1073741824, 1077936128, 1082130432,
       1084227584, 1086324736, 1088421888, 1090519040, 1091567616])
票数 114
EN

Stack Overflow用户

发布于 2012-05-17 00:29:42

更新:此函数仅在可能的情况下避免复制,因此这不是此问题的正确答案。unutbu's answer是正确的选择。

代码语言:javascript
复制
a = a.astype(numpy.float32, copy=False)

numpy astype有一个复制标志。为什么我们不能使用它呢?

票数 162
EN

Stack Overflow用户

发布于 2010-12-09 00:59:50

您可以更改数组类型而不进行转换,如下所示:

代码语言:javascript
复制
a.dtype = numpy.float32

但首先,您必须将所有整数更改为将被解释为相应的浮点数的值。一种非常慢的方法是使用python的struct模块,如下所示:

代码语言:javascript
复制
def toi(i):
    return struct.unpack('i',struct.pack('f',float(i)))[0]

...applied到数组中的每个成员。

但也许更快的方法是使用numpy的ctypeslib工具(我不熟悉)。

编辑- -

由于ctypeslib似乎不起作用,那么我将继续使用典型的numpy.astype方法进行转换,但在内存限制内继续进行块大小的转换:

代码语言:javascript
复制
a[0:10000] = a[0:10000].astype('float32').view('int32')

...then完成后更改数据类型。

下面是一个函数,它可以完成任何兼容数据类型的任务(只适用于具有相同大小项的数据类型),并通过用户控制块大小来处理任意形状的数组:

代码语言:javascript
复制
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
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4389517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档