關於copy
參數:
默認情況下,astype總是返回一個新分配的數組。如果將此 設置爲false,並且滿足dtype
,order
和subok
的要求,則會返回輸入數組而不是 的副本。
所以它是有條件的。
In [540]: x=np.arange(10)
In [542]: x.dtype
Out[542]: dtype('int32')
In [543]: z=x.astype('float32',copy=False)
In [544]: z
Out[544]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.], dtype=float32)
In [545]: x.__array_interface__
Out[545]:
{'data': (188221848, False),
'descr': [('', '<i4')],
'shape': (10,),
'strides': None,
'typestr': '<i4',
'version': 3}
In [546]: z.__array_interface__
Out[546]:
{'data': (191273640, False),
'descr': [('', '<f4')],
'shape': (10,),
'strides': None,
'typestr': '<f4',
'version': 3}
z
具有不同的存儲位置。
在你的鏈接接受的答案似乎工作
In [549]: z=x.view('float32')
In [550]: z[:]=x
In [551]: z
Out[551]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.], dtype=float32)
In [552]: x
Out[552]:
array([ 0, 1065353216, 1073741824, 1077936128, 1082130432,
1084227584, 1086324736, 1088421888, 1090519040, 1091567616])
In [553]: z
Out[553]: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.], dtype=float32)
In [555]: x.__array_interface__
Out[555]:
{'data': (188221848, False),
'descr': [('', '<i4')],
'shape': (10,),
'strides': None,
'typestr': '<i4',
'version': 3}
In [556]: z.__array_interface__
Out[556]:
{'data': (188221848, False),
'descr': [('', '<f4')],
'shape': (10,),
'strides': None,
'typestr': '<f4',
'version': 3}
這工作,因爲z
共享內存x
,但有不同的dtype
。當從x
複製到z
時,它們被轉換爲匹配新的dtype。內存位置被保留。但我不能保證沒有臨時緩衝區。
在情況下,它是不明確的,轉換形式int32
到float32
需要在底層字節的變化。整數的位表示與浮點數的不同。
In [594]: np.array(1, 'int32').tobytes()
Out[594]: b'\x01\x00\x00\x00'
In [595]: np.array(1, 'float32').tobytes()
Out[595]: b'\x00\x00\x80?'
大概可以通過部分來完成。 'y = x.view(dtype = np.float64); y [:10000] = x [:10000] .astype(np.float64)' –
您鏈接的問題不足以解決您的問題?看起來像一個完全重複給我。 – Eric