2017-09-01 55 views
0

我正在使用python中的5x5x5x5x5 5维数组。从多维数组(PYTHON)返回任意行

如何使一个函数,

  • 将采取整数i(1 < = I < = 5),其尺寸要迭代通过,另4个维度[A,B的列表,C,d]要在
  • 返回锁定长度5

的例如一维列表:

>>> BB =(5维阵列)

>>> rowExtract(3,[2,3,0,2],BB)

* [BB [2] [3] [I] [0] [2]对i在范围( 5)] *返回

的3是用于第三尺寸,且2,3,0,2表示其它尺寸

我可以通过硬编码5个不同的场景做,但有更简单的办法?

回答

0

我认为没有其他办法。所以像这样

def extractRow(row, arr, bb): 
    if row == 0: 
     return [bb[i][arr[0]][arr[1]][arr[2]][arr[3]] for i in range(5)] 
    elif row == 1: 
     return [bb[arr[0]][i][arr[1]][arr[2]][arr[3]] for i in range(5)] 
    ... 
+0

嗯,我同意。我还没有在互联网上的其他地方看到过这样的问题。看起来Python似乎不支持这样一个特定的问题。谢谢! – marlont

1

下面是使用循环的一种方法。

def extract_row(row, arr, bb): 
    N = len(arr) + 1 

    pre_mat = bb 
    for i in range(row): 
    pre_mat = pre_mat[arr[i]] 

    ans = [] 
    for i in range(N): 
    mat = pre_mat[i] 
    for j in range(row + 1, N): 
     mat = mat[arr[j - 1]] 

    ans.append(mat) 

    return ans 
0

一个可能的解决方案使用迭代器来生成索引序列。 “缺失”维可以插入到arr中,并且每次通过生成器循环时都会使用下一个值填充该索引。每次发生器产生时,它会生成一个5元素数组,其中包含从bb中提取下一个值所需的索引。然后你可以从bb中选择你想要的元素。

def extract_row(row, bb, arr): 
    retval = [] 
    for a0, a1, a2, a3, a4 in iter_indices(row, arr): 
     retval.append(bb[a0][a1][a2][a3][a4]) 
    return retval 

def iter_indices(row, arr): 
    arr.insert(row, None) 
    for i in range(5): 
     arr[row] = i 
     yield arr 

# TEST CODE FOLLOWS 
g = 0 
def deepen(b, n): 
    global g 
    if n == 1: 
     b.append(g) 
     b.append(g+1) 
     b.append(g+2) 
     b.append(g+3) 
     b.append(g+4) 
     g += 5 
     return b 
    for m in range(5): 
     b.append(deepen([], n-1)) 
    return b 

a = [] 
deepen(a, 5) 

# Run it using the test matrix a 
print(extract_row(1, a, [1, 2, 3, 4])) 
print(a[1][0][2][3][4], a[1][1][2][3][4], a[1][2][2][3][4], a[1][3][2][3][4], a[1][4][2][3][4]) 


Output is: 
[694, 819, 944, 1069, 1194] 
694 819 944 1069 1194