我目前尝试将大量数组打包到 numpy 结构化数组中。根据numpy 文档
子数组始终具有 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 文档的引用中,我认为子数组始终具有 C 连续内存布局,但这似乎仅适用于行或给定每个数组的形状时。
这种行为从何而来?正在定义“外部”形状(我不知道如何称呼它......)告诉numpy制作子数组的逐行子数组,同时为每个子数组指定形状直接连续存储每个子-大批?
当所有子数组的第一个维度相等而第二个维度不相等时,最好的处理方法是什么?我应该直接指定每个形状以保持它们连续吗?