【发布时间】:2021-05-18 14:56:03
【问题描述】:
我想了解如何正确地将 4 维数组表示为 1 维数组,以便我可以正确地进行索引(即在给定 4 个输入坐标的情况下检索 1D 数组中的数组条目)。谁能指出 4-D 数组的正确索引?
我在这里有一个最小的例子(我将数组的奇数索引条目设置为 1)。 dim4_index 是特别感兴趣的计数器。
#python script to count a 4-d array and check that we get what we expect
import numpy as np
from numpy import zeros
x_arrsize=3
y_arrsize=x_arrsize+1
z_arrsize=x_arrsize+1
w_arrsize=x_arrsize+1
a=zeros([x_arrsize,y_arrsize,z_arrsize,w_arrsize])
print a
#set every entry not divisible by 2 to 1
for x in range(0, x_arrsize):
for y in range(0, y_arrsize):
for z in range(0,z_arrsize):
for w in range(0,w_arrsize):
if((x%2>0) or (y%2>0) or (z%2>0) or (w%2>0)):
a[x][y][z][w]=1
flat_arr=a.flatten()
print flat_arr
print('\n')
for i in range(0,x_arrsize):
for j in range(0,y_arrsize):
for k in range(0,z_arrsize):
for l in range(0,w_arrsize):
# use stack overflow formula here
#index each unique hit in the array:
#arrays are indexed as follows:
# N dim representation:
# (Hit, Stream, Block, Thread)
#formula from stack overflow:
# Array[N,M,K,L] - > 1d rep is Array[N*M*K*L]
# flat_index(i,j,k,l) -> 1d rep -> (M*N*K)*i+(M*N)*j+M*k+l
index_firstpart=(x_arrsize)*(y_arrsize)*(z_arrsize)
index_secondpart=(x_arrsize)*(y_arrsize)
index_thirdpart=(y_arrsize)
# 1D representation
dim4_index=index_firstpart*i+index_secondpart*j+index_thirdpart*k+l
val_orig=a[i][j][k][l]
if(a[i][j][k][l]>0):
print("Original coordinates ({},{},{},{}), New index: {},val_orig: {} val_new: {}".format(i,j,k,l,dim4_index,val_orig,flat_arr[dim4_index]))
当 n 维数组是超立方体时,此逻辑似乎可以正常工作(因此 NxNxNxN,但当我将其更改为 MxNxNxN 时)我发现某些展平数组未正确调用(即,当我预期时检索到零条目1).
所以我的表示公式可能不太准确。
是否有一个通用公式来表示这种从 4D -> 1D 的转换?如果可能的话,我更喜欢非 numpy 的解决方案(转换的公式是我正在寻找的)。
我尝试使用的链接公式:Need of an algorithm for arrays index in a flat representation
我们将不胜感激。
【问题讨论】:
-
您刚刚弄乱了链接答案中的公式。每次您的
z暗淡增加时,这意味着您已经增加了w的整个大小,因此增加了L,而不是M。多看一下链接的问题/手动解决一个小数组。您需要乘以所有后续维度的大小,而不是当前维度的大小