为什么更改numpy数组的元素类型会改变数组的形状?我是numpy的新手,我试图将dtype从现有的np.int32更改为np.float16。这样做会改变数组的形状,但更改为np.float32不会修改形状。
>>> import numpy as np
>>> arr1=np.array([1,2,3,4]
>>> arr1
array([1, 2, 3, 4])
>>> arr1.shape
(4,)
>>> arr1.dtype=np.float16
>>> arr1
array([ 5.96046448e-08, 0.00000000e+00, 1.19209290e-07,
0.00000000e+00, 1.78813934e-07, 0.00000000e+00,
2.38418579e-07, 0.00000000e+00], dtype=float16)
>>> arr1.shape
(8,)
答案 0 :(得分:2)
因为更改数组的数据类型会改变实际存储的字节数,以及它们中有多少组成一个值。
您的初始数组可能具有数据类型int32
,因此四个值中的每一个都包含四个字节:
a = np.array([1, 2, 3, 4], dtype=np.int32)
a
>>> array([1, 2, 3, 4], dtype=int32)
bytes(a)
>>> b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00'
更改数据类型不会更改存储的字节,而只会改变它们的含义:
a.dtype = np.float16
bytes(a)
>>> b'\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00'
a
>>> array([ 5.96046448e-08, 0.00000000e+00, 1.19209290e-07,
0.00000000e+00, 1.78813934e-07, 0.00000000e+00,
2.38418579e-07, 0.00000000e+00], dtype=float16)
要实际转换值,请使用.astype
:
a.astype(np.float32)
>>> array([ 1., 2., 3., 4.], dtype=float32)
答案 1 :(得分:0)
您不应该使用atrtibute dtype来“更改”数组的dtype。您还可以看到,与原始数字相比,新数字没有意义。
相反,您应该使用arr1.astype(np.float16)
。
我的猜测是,通过直接更改dtype,你只需告诉numpy改变每个元素读取的内存量。因此,由于你从float32减少到float16,这是内存表示的一半,你得到的是大小的两倍。
答案 2 :(得分:0)
如果要更改数组的数据类型,则应执行arr1.astype(np.float16)
。
我对此并不完全确定,但我猜numpy通过将数组的内存使用量除以数据类型的大小来计算形状。
如果你直接修改dtype
,那么数组仍然认为它的元素大小相同,所以你可能会得到不同的答案。