我试图编写一个读取多个数据文件的代码来分析它们,我有以下内容:
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一样变化最快 - 这究竟意味着什么,我无法在网上找到一个明确解释这个问题的例子?
其次,当我重新塑造数组时,我不会得到我想要的东西,因为它会重塑它,然后我会查看最终数组的特定条目,而不是它应该是什么。
附上的图片是我想要的最终数组的意思:
最后,我是否以正确的方式完成这项任务,即我想做什么更方便?
编辑:下面是特定样本的.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文件附加到此帖子中)
答案 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阵列后,如果一个订单更方便,您可以轻松地重塑和/或转置。您必须进行一些时间测试,以验证一个订单或其他订单是否更快,以满足您所需的各种访问需求。让事情变得有效,并在以后担心速度。