求N维扁平化数组取视图的起止索引通用计算公式
N维数组视图的扁平化起止索引通用计算方法
定义变量
先明确几个关键变量:
- 数组维度列表:
dims = (d₀, d₁, d₂, ..., dₙ₋₁),对应N维数组各维度的长度 - 固定索引集合:假设我们固定前
k个维度的索引为(i₀, i₁, ..., iₖ₋₁),要获取剩余N-k维的子数组视图 - 扁平化数组总长度:
total_len = d₀ × d₁ × ... × dₙ₋₁
通用公式
1. 视图长度(步长)
视图对应的扁平化数组片段长度,等于剩余未固定维度的乘积:
view_len = dₖ × dₖ₊₁ × ... × dₙ₋₁
2. 起始索引
先预计算每个维度的跨度(stride):strides[s] = dₛ₊₁ × dₛ₊₂ × ... × dₙ₋₁(即第s个维度之后所有维度的乘积)。
起始索引为各固定索引与对应跨度的乘积之和:
start_index = i₀ × strides[0] + i₁ × strides[1] + ... + iₖ₋₁ × strides[k-1]
3. 结束索引
结束索引直接由起始索引加上视图长度得到:
end_index = start_index + view_len
实例验证
2维数组(dims=(M,K))
取n_arr[i](固定第1个维度,k=1,i₀=i):
strides[0] = Kstart_index = i × Kview_len = Kend_index = i×K + K,与题目给出的结果完全一致。
3维数组(dims=(D0,D1,D2))
- 取
n_arr[i][j](固定前2个维度,k=2,i₀=i, i₁=j):strides[0] = D1×D2,strides[1] = D2start_index = i×D1×D2 + j×D2view_len = D2end_index = i×D1×D2 + j×D2 + D2,对应扁平化数组中连续D2个元素,正好是3维数组(i,j,:)的所有元素。
- 取
n_arr[i](固定第1个维度,k=1,i₀=i):start_index = i×D1×D2view_len = D1×D2end_index = i×D1×D2 + D1×D2,对应扁平化数组中连续D1×D2个元素,即3维数组的第i个二维子数组。
内容的提问来源于stack exchange,提问作者JS4137
相关产品推荐
相关产品推荐

