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

问题描述 投票:1回答:2

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

为什么会这样?

提前致谢!

python arrays numpy
2个回答
5
投票

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

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

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

或者更简单:

x.astype(np.int8)

0
投票

dtype.gist link

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

我希望这能帮到您

© www.soinside.com 2019 - 2024. All rights reserved.