加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 了解numpy数组如何在内存中布局

发布时间:2020-12-16 21:52:54 所属栏目:Python 来源:网络整理
导读:我正在尝试使用numpy在python中使用构建OpenGL纹理,但我遇到了问题,因为我无法预测numpy数组将如何在内存中组织.下面的示例程序(应该按原样运行)说明了我的困惑: from pylab import *array_by_hand = array( [[[1,2,3,4],[1,4]],[[1,4]]],dtype='uint8')lay

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

from pylab import *

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

layers = 1 * ones((2,2)),2 * ones((2,3 * ones((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连续布局.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读