将2D数组转换为3D数组Numpy Python 3.6

时间:2018-03-25 01:36:29

标签: python arrays numpy python-3.6

我试图编写一个读取多个数据文件的代码来分析它们,我有以下内容:

import numpy as np
import os
import glob

os.chdir('/Users/basilowen/Documents/Physics Degree/Fourth Year /Project/dielectric raw data/B22 full temp scan') 


data_files = glob.glob('**/*.TXT',recursive=True)

data_files.sort()

data = np.array([]).reshape(0,6)

for i in data_files:
    item=np.genfromtxt(i,skip_header=3)
    data=np.r_[data,item]

data=np.reshape(data,(37,6,11),order="F")

所以基本上我的代码所做的是读取11个.txt文件(所有文件具有完全相同的维度,只是不同的值)忽略前3行数据然后将它们添加到具有数组最终维度的空数组(407 ,6)在for循环结束后(每个.txt文件是一个数据集,其中包含维度(37,6),忽略前3行数据后,我得到了数据的温度)。我想分别访问每个.txt文件(每个温度)的数据,所以我想我可以重新塑造数组,因此它有尺寸(37,6,11),即重新排列索引而不更改数据,然后我可以循环第三个指数并为每个温度制作图表等(以后也会有用,以便记下它是什么特定的临时一(37,6)数据集并以某种方式标记它)

首先,当我重塑数组时,我不确定参数顺序是做什么的 - 我查了一下它并在python文档上说它" F"这意味着第一个索引变化最快,如Fortran和" C"这意味着最后一个指数像C一样变化最快 - 这究竟意味着什么,我无法在网上找到一个明确解释这个问题的例子?

其次,当我重新塑造数组时,我不会得到我想要的东西,因为它会重塑它,然后我会查看最终数组的特定条目,而不是它应该是什么。

附上的图片是我想要的最终数组的意思:

enter image description here

最后,我是否以正确的方式完成这项任务,即我想做什么更方便?

编辑:下面是特定样本的.txt文件之一(同一文件夹中有10个其他.txt文件,代表10个其他温度下相同样本的测量数据)

B22 polymer blend membrane full temp scan  Temp. [K]=2.5315e+02  AC Volt  [Vrms]=1.000e+00
Fixed value(s) :  Temp. [K] = 2.531e+02,   AC Volt  [Vrms] = 1.000e+00
 Freq. [Hz]  Eps'    Eps''   Sig' [S/cm]     Sig'' [S/cm]    |Sig| [S/cm]
 17779e+02   30662e-04   24080e-05   23817e-11  -20436e-10   20575e-10
 11545e+02   31479e-04   30542e-05   19616e-11  -13795e-10   13934e-10
 74968e+01   32179e-04   34625e-05   14441e-11  -92501e-11   93621e-11
 48680e+01   33029e-04   39643e-05   10736e-11  -62368e-11   63286e-11
 31611e+01   34038e-04   45633e-05   80250e-12  -42274e-11   43028e-11
 20526e+01   35202e-04   52863e-05   60365e-12  -28778e-11   29405e-11
 13329e+01   36526e-04   61647e-05   45713e-12  -19670e-11   20194e-11
 86551e+00   38046e-04   72474e-05   34896e-12  -13505e-11   13948e-11
 56202e+00   39796e-04   85994e-05   26887e-12  -93161e-12   96964e-12
 36495e+00   41817e-04   10314e-04   20940e-12  -64598e-12   67908e-12
 23698e+00   44167e-04   12518e-04   16504e-12  -45045e-12   47973e-12
 15388e+00   46917e-04   15395e-04   13180e-12  -31604e-12   34242e-12
 99924e-01   50170e-04   19208e-04   10678e-12  -22331e-12   24752e-12
 64886e-01   54075e-04   24318e-04   87782e-13  -15910e-12   18171e-12
 42133e-01   58865e-04   31215e-04   73168e-13  -11454e-12   13591e-12
 27359e-01   64869e-04   40525e-04   61681e-13  -83513e-13   10382e-12
 17766e-01   72393e-04   53038e-04   52421e-13  -61667e-13   80937e-13
 11536e-01   81764e-04   69974e-04   44908e-13  -46057e-13   64327e-13
 74911e-02   92874e-04   92921e-04   38725e-13  -34538e-13   51889e-13
 48643e-02   10589e-03   12505e-03   33841e-13  -25948e-13   42644e-13
 31587e-02   12049e-03   17113e-03   30071e-13  -19416e-13   35795e-13
 20511e-02   13611e-03   23865e-03   27232e-13  -14390e-13   30801e-13
 13319e-02   15243e-03   34008e-03   25199e-13  -10554e-13   27320e-13
 86485e-03   16916e-03   49441e-03   23788e-13  -76576e-14   24990e-13
 56159e-03   18608e-03   73042e-03   22820e-13  -55012e-14   23474e-13
 36467e-03   20401e-03   10937e-02   22189e-13  -39360e-14   22535e-13
 23680e-03   22460e-03   16526e-02   21771e-13  -28271e-14   21954e-13
 15377e-03   25244e-03   25129e-02   21497e-13  -20740e-14   21596e-13
 99848e-04   29716e-03   38317e-02   21284e-13  -15951e-14   21344e-13
 64836e-04   37803e-03   58596e-02   21135e-13  -13275e-14   21177e-13
 42101e-04   53963e-03   89635e-02   20994e-13  -12405e-14   21031e-13
 27339e-04   86936e-03   13687e-01   20817e-13  -13070e-14   20858e-13
 17752e-04   15210e-02   20849e-01   20591e-13  -14922e-14   20645e-13
 11527e-04   28215e-02   31642e-01   20291e-13  -18029e-14   20371e-13
 74854e-05   53790e-02   47764e-01   19890e-13  -22358e-14   20016e-13
 48606e-05   10146e-01   71407e-01   19309e-13  -27410e-14   19503e-13
 31563e-05   19010e-01   10584e+00   18584e-13  -33363e-14   18881e-13

(我不确定如何将此.txt文件附加到此帖子中)

2 个答案:

答案 0 :(得分:1)

在阅读文件之前,您已经知道data数组的所需形状,因此,使用其最终形状直接创建它会更简单:

import numpy as np
import os
import glob

os.chdir('/Users/basilowen/Documents/Physics Degree/Fourth Year /Project/dielectric raw data/B22 full temp scan') 


data_files = glob.glob('**/*.TXT',recursive=True)

data_files.sort()

data = np.empty((37,6,11))

for i,file in enumerate(data_files):
    data[:,:,i]=np.genfromtxt(file,skip_header=3)

为了使用reshape命令执行此操作,您应该使用order='C'代替它,并使用11作为第一个维度。这里有一个简单的例子,试图解释重塑顺序的差异。我们从一维数组开始,我们将重塑为二维数组:

import numpy as np
a = np.arange(12)
c = a.reshape((6, 2),order='C')
f = a.reshape((6, 2),order='F')

使用order='C'时,输出的第二个索引会先改变,因此,将应用以下映射:

  • a[0] -> c[0,0]
  • a[1] -> c[0,1]
  • a[2] -> c[1,0]
  • ...

而对于order='F',映射就是这样:

  • a[0] -> f[0,0]
  • a[1] -> f[1,0]
  • a[2] -> c[2,0]
  • ...

因此,输出将是:

>>> c
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])
>>> f
array([[ 0,  6],
       [ 1,  7],
       [ 2,  8],
       [ 3,  9],
       [ 4, 10],
       [ 5, 11]])

最后,我们可以使用这个简单的示例来说明您的情况,方法是将c重塑为3D数组:

>>> arr_3d = c.reshape((3,2,2),order='C')
>>> arr_3d
array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11]]])
>>> arr_3d[0,:,:]
array([[0, 1],
       [2, 3]])

答案 1 :(得分:0)

最好在列表中收集数组,并在最后使用一个调用加入它们。它更有效,更容易。

alist = []
# data = np.array([]).reshape(0,6)

for i in data_files:
    item=np.genfromtxt(i,skip_header=3)     # (37,6) array
    alist.append(item)
    # data=np.r_[data,item]
data = np.stack(alist, axis=2)  # to make (37,6,11)
# data=np.reshape(data,(37,6,11),order="F")

# np.stack(alist) # default axis=0
# np.array(alist) # both produce (11,37,6)

担心秩序还为时过早。由genfromtxt创建,他们是订单' C'。 numpy可以轻松地沿3个轴中的任意一个访问数据。如果需要,最简单的方法是在第一维上循环。

制作3d阵列后,如果一个订单更方便,您可以轻松地重塑和/或转置。您必须进行一些时间测试,以验证一个订单或其他订单是否更快,以满足您所需的各种访问需求。让事情变得有效,并在以后担心速度。