【发布时间】:2018-08-17 10:54:34
【问题描述】:
我目前尝试将大量数组打包成 numpy 结构化数组。 根据to the numpy documentation
子数组始终具有 C 连续内存布局。
但如果我创建一个结构化数组:
x = np.zeros((2,), dtype=[('a', (np.float64, 5)), ('b', (np.float64, 5))])
x['a'].flags
# Out: C_CONTIGUOUS : False
# F_CONTIGUOUS : False
# OWNDATA : False
# ...
虽然
x.flags
# Out: C_CONTIGUOUS : True
# F_CONTIGUOUS : True
# OWNDATA : True
# ...
并且使用(1,) 的“外部”形状来生成数组:
x = np.zeros((1,), dtype=[('a', (np.float64, 5)),('b',(np.float64, 7))])
x['a'].flags
# Out: C_CONTIGUOUS : True
# F_CONTIGUOUS : False
# OWNDATA : False
# ...
省略 (1,) 会产生带有 ndim=1 且 c 邻接的数组。所以引用似乎是 True 仅适用于结构化数组的行。
让我感到困惑的是,当我直接为每个子数组指定数组形状时,会给出连续性:
x = np.zeros((), dtype=[('a', (np.float64, (2, 5))), ('b', (np.float64, (2, 5)))])
x['a'].flags
#Out: C_CONTIGUOUS : True
# F_CONTIGUOUS : False
# OWNDATA : False
从 numpy 文档的引用中,我认为子数组 always 具有 C 连续内存布局,但这似乎仅适用于行或给定每个数组的形状时。
这种行为从何而来?正在定义“外部”形状(我不知道如何称呼它......)告诉 numpy 制作子数组的逐行子数组,同时为每个子指定形状-array 直接连续存储每个子数组?
当所有子数组的第一个维度相等而第二个维度不相等时,最好的处理方法是什么?我应该直接指定每个形状以保持它们连续吗?
【问题讨论】:
-
你为什么担心这种连续性?
-
我没有听懂你的最后一句话。在 dtype 定义中,必须指定子数组维度。
标签: python arrays numpy structured-array