更改numpy数组的dtype会影响数据

时间:2017-06-09 03:55:23

标签: python arrays numpy

虽然我正在玩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)

为什么会这样?

提前致谢!

2 个答案:

答案 0 :(得分:5)

当您按照您的方式更改dtype时,不会更改数据,而是更改数据的解释。这意味着对于每个int64(您的标准int类型),您将获得8个int8值。并且在内存中的LSB字节顺序中,最低的8位(即最低字节)是第一位的,给出你的数字(只要它小于256),然后是7个零。

您可能想要做的是转换数据并生成新的内存布局,从旧的阵列生成新阵列,这可以通过以下方式完成:由:

x=np.array(x, dtype=np.int8)

或更简单:

x.astype(np.int8)

答案 1 :(得分:0)

enter image description here

我已经播放了你的代码,并观察到当你更改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位不能保持它将显示除你的值以外的东西。所以这就是内存分配。

我希望这会对你有所帮助