python如何改变数据类型_如何改变numpy数组的数据类型和形状?

数据类型的混合使得这种转换比通常更复杂。最后的答案是,将字段复制到目标数组具有速度和通用性的结合。在

让我们构造一个示例:In [850]: dt

Out[850]: dtype([('cycle', '

In [851]: x=np.zeros((3,),dt)

In [852]: x['cycle']=[0,10,23]

In [853]: x['dxn']=[3,2,2]

In [854]: x['V']=[1,1,1]

In [855]: x

Out[855]:

array([(0, 3, 0.0, 1.0, 0.0), (10, 2, 0.0, 1.0, 0.0),

(23, 2, 0.0, 1.0, 0.0)],

dtype=[('cycle', '

我们可以按照该链接中建议的方式查看3个浮动字段:

^{pr2}$

但是如果我想更改所有值,我需要制作y的副本。不允许一次写入多个字段。在In [863]: y=x[list(x.dtype.names[2:])].view(dt1).copy()

In [864]: y['f0']=np.arange(9.).reshape(3,3)

具有一个数据类型的view无法捕获行结构;我们必须用reshape将其添加回来。dt1和(3,)形状可以避免这个问题。在In [867]: x[list(x.dtype.names[2:])].view(np.float32)

Out[867]: array([ 0., 1., 0., 0., 1., 0., 0., 1., 0.], dtype=float32)In [868]: x.tolist()

Out[868]: [(0, 3, 0.0, 1.0, 0.0), (10, 2, 0.0, 1.0, 0.0), (23, 2, 0.0, 1.0, 0.0)]

In [869]: np.array(x.tolist())

Out[869]:

array([[ 0., 3., 0., 1., 0.],

[ 10., 2., 0., 1., 0.],

[ 23., 2., 0., 1., 0.]])

可以使用astype转换各个字段:In [878]: x['cycle'].astype(np.float32)

Out[878]: array([ 0., 10., 23.], dtype=float32)

In [879]: x['dxn'].astype(np.float32)

Out[879]: array([ 3., 2., 2.], dtype=float32)

但不是多个字段:In [880]: x.astype(np.float32)

Out[880]: array([ 0., 10., 23.], dtype=float32)

recfunctions帮助操作结构化数组(和重新排列)from numpy.lib import recfunctions

它们中的许多构造了一个新的空结构,并逐字段复制值。在这种情况下,相当于:In [890]: z=np.zeros((3,5),np.float32)

In [891]: for i in range(5):

.....: z[:,i] = x[x.dtype.names[i]]

In [892]: z

Out[892]:

array([[ 0., 3., 0., 1., 0.],

[ 10., 2., 0., 1., 0.],

[ 23., 2., 0., 1., 0.]], dtype=float32)

在这个小例子中,它比np.array(x.tolist())慢一点。但对于30000张唱片来说,这个速度要快得多。在

在结构化数组中,记录通常比字段多,因此字段的迭代并不慢。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值