如何将多维数组转换为二维数组

时间:2019-02-15 14:56:45

标签: python numpy multidimensional-array

在这里,我的代码专长于表单文本文件;并将矩阵创建为多维数组,但是问题是代码创建的数组比二维数组更多,我无法操纵,我需要二维数组,我该怎么做?

解释我的代码的算法:

代码动机: 我的代码从一个特定的文件夹中获取值,每个文件夹包含一个用户生成的7个“ txt”文件,这样,多个文件夹将包含多个用户的多个数据。

步骤1:启动第一个for循环,并使用特定文件夹中的文件夹数量来控制它,并在变量“ path”中存储第一个文件夹的第一个路径。

第2步:使用2nd for loop打开路径并获取7个txt文件的数据。专长之后,它关闭2nd for loop并执行其余代码。

step3:将7个txt文件的数据合并到一个1d数组中。

step4(此处出现问题):将每个文件夹的1d位置存储为2d数组。首先结束循环。

代码:

import numpy as np
from array import *
import os
f_path='Result'
array_control_var=0

#for feacth directory path
for (path,dirs,file) in os.walk(f_path):
    if(path==f_path):
        continue
    f_path_1= path +'\page_1.txt'
    #Get data from page1 indivisualy beacuse there string type data exiest
    pgno_1 = np.array(np.loadtxt(f_path_1, dtype='U', delimiter=','))

    #only for page_2.txt
    f_path_2= path +'\page_2.txt'
    with open(f_path_2) as f:
        str_arr = ','.join([l.strip() for l in f])
    pgno_2 = np.asarray(str_arr.split(','), dtype=int)

    #using loop feach data from those text file.datda type = int
    for j in range(3,8):

    #store file path using variable
        txt_file_path=path+'\page_'+str(j)+'.txt'


        if os.path.exists(txt_file_path)==True:

            #genarate a variable name that auto incriment with for loop
            foo='pgno_'+str(j)
        else:
            break

        #pass the variable name as string and store value
        exec(foo + " = np.array(np.loadtxt(txt_file_path, dtype='i', delimiter=','))")

    #z=np.array([pgno_2,pgno_3,pgno_4,pgno_5,pgno_6,pgno_7])




    #marge all array from page 2 to rest in single array in one dimensation
    f_array=np.concatenate((pgno_2,pgno_3,pgno_4,pgno_5,pgno_6,pgno_7), axis=0)

    #for first time of the loop assing this value
    if array_control_var==0:
        main_f_array=f_array
    else:
        #here the problem arise 
        main_f_array=np.array([main_f_array,f_array])
    array_control_var+=1
print(main_f_array)

当前我的代码生成这样的数组(用于3个文件夹)

[
 array([[0,0,0],[0,0,0]]),
 array([0,0,0])
]

注意:我不知道它有多少尺寸

但是我想要

[
array( 
  [0,0,0]
  [0,0,0]
  [0,0,0])
]

1 个答案:

答案 0 :(得分:0)

我试图编写一个递归代码,将列表的列表递归地压缩为一个列表。它为您的情况提供了所需的输出,但是我没有在许多其他输入中尝试过(对于某些情况,它是有问题的,例如:list =[0,[[0,0,0],[0,0,0]],[0,0,0]])……

flat = []

def main():
    list =[[[0,0,0],[0,0,0]],[0,0,0]]
    recFlat(list)
    print(flat)

def recFlat(Lists):
    if len(Lists) == 0:
        return Lists
    head, tail = Lists[0], Lists[1:]
    if isinstance(head, (list,)):
        recFlat(head)
        return  recFlat(tail)
    else:
        return flat.append(Lists)

if __name__ == '__main__':
    main()

我在代码背后的想法是遍历每个列表的头部,并检查它是列表的实例还是元素。如果head是一个元素,则意味着我有一个平面列表,我可以返回该列表。否则,我应该递归遍历更多。