【发布时间】:2015-03-12 22:58:34
【问题描述】:
这是现有 question 的 3D 版本。
形状为 (n,n,n) 的 3D 数组 M[x,y,z] 应映射到仅包含 xindex := x + (y+1)*y/2)。我试图推导出一些公式,但无法正确。请注意,向量内的元素顺序无关紧要。
【问题讨论】:
标签: arrays algorithm matrix indexing
这是现有 question 的 3D 版本。
形状为 (n,n,n) 的 3D 数组 M[x,y,z] 应映射到仅包含 xindex := x + (y+1)*y/2)。我试图推导出一些公式,但无法正确。请注意,向量内的元素顺序无关紧要。
【问题讨论】:
标签: arrays algorithm matrix indexing
这是 user3386109 的答案的扩展,用于将形状为 (n,...,n) 的任意维度数组 d 映射到大小为 size(d,n) 的向量中,该向量仅包含索引满足 X_1 <= X_2 <= ... <= X_d 的元素。
【讨论】:
方程的 3D 版本是
index := (z * (z+1) * (z+2)) / 6 + (y * (y+1))/2 + x
【讨论】:
(n,n,n)时得到的向量的长度?
(n,0,0) 的索引,即数组中not的第一个坐标的索引。因此size := (n * (n+1) * (n+2)) / 6
index := (l * (l+1) * (l+2) * (l+3) )/24 + (k * (k+1) * (k+2))/6 + (j * (j+1))/2 + i 对应于M[i,j,k,l],并且向量的大小为n*(n+1)*(n+2)/6*(n+3)/4。 24=6*4。
如果有人感兴趣,这里是@letmaik 在 python 中的回答代码:
import math
from itertools import combinations_with_replacement
import numpy as np
ndim = 3 # The one you'd like
size = 4 # The size you'd like
array = np.ones([size for _ in range(ndim)]) * -1
indexes = combinations_with_replacement([n for n in range(size)], ndim)
def index(*args):
acc = []
for idx, val in enumerate(args):
rx = np.prod([val + i for i in range(idx + 1)])
acc.append(rx / math.factorial(idx + 1))
return sum(acc)
for args in indexes:
array[args] = index(*args)
print(array)
虽然我必须承认它可以改进,因为元素的顺序看起来不自然。
【讨论】: