【问题标题】:Representing a 4D array as a 1D array python将 4D 数组表示为 1D 数组 python
【发布时间】: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。多看一下链接的问题/手动解决一个小数组。您需要乘以所有后续维度的大小,而不是当前维度的大小

标签: python arrays


【解决方案1】:

现在尝试了一个新的例子,而不是从第一原则开始:

import numpy as np
from numpy import zeros
arrsize=10
x_arrsize=arrsize
y_arrsize=arrsize+1
z_arrsize=arrsize+2
w_arrsize=arrsize+3
a=zeros([x_arrsize,y_arrsize])
for x in range(0,x_arrsize):
    for y in range(0,y_arrsize):
        if((x==y)):
            a[x][y]=1 # define as 1 if X=Y=Z
print("2D EXAMPLE")
print a
flat_arr=a.flatten()
print flat_arr
print("DIRECT REPRESENTATION (2D)")
for itr in range(0,len(flat_arr)):
    if(flat_arr[itr]>0):
        print (itr,flat_arr[itr])
print("TRANSFORMATION (2D)")
for x in range(0,x_arrsize):
    for y in range(0,y_arrsize):
        dim2_index=x+y*x_arrsize
        if(flat_arr[dim2_index]>0):
            print(dim2_index,flat_arr[dim2_index])
        

print("3D EXAMPLE")
            
b = zeros([x_arrsize,y_arrsize,z_arrsize])
for x in range(0,x_arrsize):
    for y in range(0,y_arrsize):
        for z in range(0,z_arrsize):
            if(x==y):
                b[x][y][z]=1

flat_b=b.flatten()
print("Flattened representation (3D)")
valid_itrs=[]
for itr in range(0,len(flat_b)):
    if(flat_b[itr]>0):
        print(itr,flat_b[itr])
        valid_itrs.append(itr)
print("Transformed representation (3D)")
for x in range(0,x_arrsize):
    for y in range(0,y_arrsize):
        for z in range(0,z_arrsize):
            dim3_index=x+y*x_arrsize+z*y_arrsize*x_arrsize
            if(flat_b[dim3_index]):
                isValidItr=(dim3_index in valid_itrs)
                print (dim3_index,flat_b[dim3_index],isValidItr)
            
print("\nNOW DOING 4D example")
c=zeros([x_arrsize,y_arrsize,z_arrsize,w_arrsize])
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==y) and (x==z)):
                    c[x][y][z][w]=1
print("4D flattened representation")
flat_c=c.flatten()
valid_itrs=[]
for itr in range(0,len(flat_c)):
    if(flat_c[itr]>0):
        print(itr,flat_c[itr])
        valid_itrs.append(itr)
print("TRANSFORMED (4D)")
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):
                dim4_index=x+y*x_arrsize+z*y_arrsize*x_arrsize+w*z_arrsize*y_arrsize*x_arrsize
                isValid=(dim4_index in valid_itrs)
                if(isValid):
                    print (dim4_index,flat_c[dim4_index],isValid)
                elif(flat_c[dim4_index]>0):
                    print(dim4_index,flat_c[dim4_index],isValid)
                else:
                    continue

现在似乎产生了正确的答案(isValid 检查始终显示 True - 基本上 x、y、z、w 循环的顺序可能不是最好的获得 4D 索引的顺序排序)。

所以我找到的公式是:

dim4_index=x+y*x_arrsize+z*y_arrsize*x_arrsize+w*z_arrsize*y_arrsize*x_arrsize

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2020-03-08
    • 2020-04-22
    • 1970-01-01
    相关资源
    最近更新 更多