为何NumPy数组可同时为C_CONTIGUOUS与F_CONTIGUOUS?
为啥你的NumPy数组同时是C连续和F连续?
哈哈,这个问题其实是个很容易踩的小细节坑!我来给你理清楚:
核心原因:一维数组的特殊性
首先你要知道:所有一维NumPy数组的C_CONTIGUOUS和F_CONTIGUOUS标记默认都是True。因为对于只有一个维度的数组来说,“行优先”(C风格)和“列优先”(Fortran风格)的内存排布逻辑完全一致——数据就是按顺序连续存在内存里的,根本不存在行或列的区分,所以两个标记都会被设为True。
你的代码里的小疏漏
看你写的代码:
b = np.arange(8,dtype='int8') b.reshape(2,4,order='F') b.flags
这里的问题是:reshape方法默认会返回一个新的数组,而你并没有把这个新的二维数组赋值给b!原变量b依然是最初创建的那个一维数组,所以它的flags自然会同时满足C连续和F连续。
验证修正后的结果
如果把reshape的结果赋值给变量,你就能看到符合预期的标记了:
import numpy as np b = np.arange(8, dtype='int8') # 将reshape后的新数组赋值给变量 b_reshaped = b.reshape(2,4,order='F') print(b_reshaped.flags)
输出的flags会是这样:
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
补充:多维数组的例外情况
另外要提一句:不是所有多维数组的两个连续标记都互斥——如果数组的某个维度长度为1(比如形状是(5,1)或者(1,3,4)),本质上和一维数组的存储逻辑类似,这时候也会出现两个标记同时为True的情况哦。
内容的提问来源于stack exchange,提问作者Tomas Sedlacek
相关产品推荐
相关产品推荐

