如何避免numpy数组列索引结果变为F_CONTIGUOUS适配mpi4py散射需求
解决方案
你可以通过以下两种常用方式,确保索引得到的数组为C_CONTIGUOUS格式:
- 使用
np.ascontiguousarray()包裹索引结果(最推荐)
该方法仅会在输入数组非C连续时触发内存复制,无额外性能开销,用法如下:
import numpy as np a = np.array([[1,2,3],[4,5,6], [7,8,9]]) b = np.ascontiguousarray(a[:, [0, 2]])
执行b.flags即可验证C_CONTIGUOUS属性为True。
- 索引后显式指定C序生成副本
如果确认需要生成独立的数组副本,可以在调用copy方法时指定order='C',强制生成C连续数组:
b = a[:, [0, 2]].copy(order='C')
原理说明
该现象是numpy花式索引的默认行为:使用整数列表选取多列时,返回的数组默认采用*Fortran列优先连续(F_CONTIGUOUS)*格式,这是numpy为降低索引操作初始开销做的优化,因为按列选取的元素天然符合列优先的内存排列规则。
针对mpi4py的使用场景,提前将数组转为C_CONTIGUOUS格式是最稳妥的处理方式,可避免散射、收集操作时出现数据错位问题。
内容的提问来源于stack exchange,提问作者Sudipta Lal Basu
相关产品推荐
相关产品推荐

