虽然我正在玩numpy,
x = np.arange(9).reshape((3,3))
x
返回array([[0, 1, 2],[3, 4, 5],[6, 7, 8]])
但是一旦我通过
更改数据类型x.dtype=np.int8
x
现在x变为array([[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,0, 0],[3, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0,0, 0],[6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0,0, 0]], dtype=int8)
,x.shape
返回(3, 24)
。
为什么会这样?
提前致谢!
答案 0 :(得分:5)
当您按照您的方式更改dtype
时,不会更改数据,而是更改数据的解释。这意味着对于每个int64(您的标准int类型),您将获得8个int8值。并且在内存中的LSB字节顺序中,最低的8位(即最低字节)是第一位的,给出你的数字(只要它小于256),然后是7个零。
您可能想要做的是转换数据并生成新的内存布局,从旧的阵列生成新阵列,这可以通过以下方式完成:由:
x=np.array(x, dtype=np.int8)
或更简单:
x.astype(np.int8)
答案 1 :(得分:0)
我已经播放了你的代码,并观察到当你更改numpy数组的数据类型时,然后根据dtype表示数组元素现在处于什么状态,而早些时候会影响数组中现在的元素数量。让我们讨论更多
在我的情况下,早期的numpy数组的dtype是int32,我把它改成了
dtype = np.int8
所以32/8 = 4,每个元素现在附加3加零,我认为在你的情况下早期的numpy数组dtype是
dtype = np.int64
为什么每个元素都附加7个零。
所以现在数组的元素是8位但在内存中它被分配了32位(在我的情况下)和64位。这就是休息记忆现在分配为零的原因。
还有一件事,现在如果你将x [0,0]改为这样的值,8位不能保持它将显示除你的值以外的东西。所以这就是内存分配。
我希望这会对你有所帮助