将.txt数据加载入10x256 3d numpy数组
我正在尝试把一些文本文件加载到numpy数组中。这些.txt文件代表了一张图像的像素,每个像素都有一个在-10到+10之间的相对坐标(x轴)和在0到10之间的坐标(y轴)。总的来说,这张图像是10x256个像素。特别的是,每个像素并没有给出RGB值,而是给出了一系列与波长值对应的强度,这些波长值在第一个用/n分隔的“头部”中列出。每个坐标的前两个值是用制表符分开的,而第一个条目只有“0 0”,因为这个格式是这样的:
Line 1: "0 0 625.15360 625.69449 626.23538 ..." (two coordinates followed by the wavelengths)
Line 2: "-10.00000 -10.00000 839 841 833 843 838 847 ..."
Line 3: "-10.00000 -9.92157 838 839 838 ..."
其中839和838代表了625.15360波长下两个相邻像素的强度,一个在另一个的上方(y值有小变化)。此外,841和839则是625.69449波长下的强度,依此类推。
到目前为止,我的思路是使用np.genfromtxt()
逐行读取文件,并将每个强度值添加到一个新的3D numpy数组中,变量(x, y, lambda)各自对应一个强度值。而且,我觉得如果x和y的范围分别是0-9和0-255来表示图像,而不是数据中给出的那些相对坐标,会更有意义...
问题是:我不知道怎么把数据加载到一个3x3的数组中(我还在琢磨2x2的情况),而且我似乎无法正确地切片...
我目前的进展:
intensity_array2 = np.zeros([len(unique_y),len(unique_x)], dtype= int)
for element in np.nditer(intensity_array2, op_flags=['readwrite']):
for i in range(len(unique_y)):
for j in range(len(unique_x)):
with open(os.path.join(path_name,right_file)) as rf:
intensity_array2[i,j] = np.genfromtxt(rf, skip_header = (i*j)+j, delimiter = " ")
其中len(unique_y) = 10
和len(unique_x) = 256
是在上面的一个函数中找到的。
2 个回答
我不是很确定我完全理解你的文件格式,所以如果我说的不对,请多包涵。不过,如果你能一次性加载所有数据,我相信这样会运行得更快。看起来你可以用下面这行代码把所有数据加载到内存中:
data = np.genfromtxt(rf, delimiter = " ")
接着,你可以创建一个三维数组:
intensity_array2 = np.zeros( (10, 256, num_wavlengths) )
然后把三维数组里的值填进去:
intensity_array2[ data[:,0], data[:,1], :] = data[:, 2:]
这样做可能不完全正确,因为你的 x 和 y 索引可能会出现负数——在这种情况下,你可能需要加一个偏移量。另外,如果你的输入文件格式比较固定,你也许可以直接对数据矩阵使用 np.reshape() 来得到你想要的结果。
在Lukeclh的回答基础上,可以尝试:
data = np.genfromtxt(rf)
接下来,去掉波长值
wavelengths = data[0]
intensities = data[1:]
现在,我们可以使用reshape来重新排列数据:
intensitiesshaped = np.reshape(intensities, (len(unique_x),len(unique_y),-1))
这里的“-1”表示“剩下的部分放这里”。
我们仍然有每个数组的前面几个值。要去掉它们,我们可以这样做:
wavelengths = wavelengths[2:]
intensitiesshaped = intensities[:,:,2:]
这只是把前两个索引的信息扔掉了。如果你需要保留这些信息,就得用一些更复杂的方法了。