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張唱片來說,這個速度要快得多。在
在結構化數組中,記錄通常比字段多,因此字段的迭代并不慢。在
總結
以上是生活随笔為你收集整理的python如何改变数据类型_如何改变numpy数组的数据类型和形状?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 队列_百战程序员:Java并发
- 下一篇: php 动态 控件,PHP技术在动态网页