gpt4 book ai didi

python - 了解 numpy 数组在内存中的布局

转载 作者:太空狗 更新时间:2023-10-30 01:16:17 25 4
gpt4 key购买 nike

我正在尝试使用 numpy 在 python 中构建 OpenGL 纹理,但我遇到了问题,因为我无法预测 numpy 数组在内存中的组织方式。下面的示例程序(应该按原样运行)说明了我的困惑:

from pylab import *

array_by_hand = array(
[[[1, 2, 3, 4], [1, 2, 3, 4]],
[[1, 2, 3, 4], [1, 2, 3, 4]]], dtype='uint8')

layers = 1 * ones((2, 2)), 2 * ones((2, 2)), 3 * ones((2, 2)), 4 * ones((2, 2))
array_from_layers = dstack(layers)
array_from_layers = array_from_layers.astype('uint8')

print array_by_hand; print
print array_from_layers; print

print ' '.join(x.encode('hex') for x in array_by_hand.data)
print ' '.join(x.encode('hex') for x in array_from_layers.data)
print
print all(array_by_hand == array_from_layers) # True
print str(array_by_hand.data) == str(array_from_layers.data) # False

尽管就 python 而言,这两个数组是等价的,但它们在内存中的布局不同,因此 OpenGL 的显示方式也不同。有人可以解释为什么会发生这种情况以及我如何将两个数组强制转换为相同的格式吗?

最佳答案

如果您改为调用 tostring 方法,它会将数组转换为 C 连续布局:

>>> array_by_hand.tostring() == array_from_layers.tostring()
True

字符串在您的情况下不同的原因是 dstack 调用。它试图通过简单地组合源数组的基础数据然后更改 numpy's stride information 来巧妙地将数组堆叠在一起。 .这会导致数组不在 C 连续布局中。

关于python - 了解 numpy 数组在内存中的布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14844737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com