我正在尝试将一些文本文件加载到numpy数组中。.txt文件表示图像的像素,其中每个像素的相对坐标为-10和+10 ( x),0和10为y,图像总计为10x256像素。问题是每个像素没有被赋予一个RGB值,而是给出一个与第一个/n分隔的“报头”中的波长值相对应的强度列表。每个坐标都被指定为第一个选项卡分隔的项,第一个条目只有" 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
。
发布于 2014-08-25 23:34:12
在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:]
这只是将前两个索引中的信息抛出一边。如果你需要保留它,你将不得不做一些更复杂的事情。
发布于 2014-08-25 19:00:11
我不确定我完全理解你的文件格式,所以如果这没有意义,请原谅我。但是,如果有任何方法可以同时加载所有数据,我相信它会运行得更快。在我看来,您可以使用它将所有数据输入内存:
data = np.genfromtxt(rf,定界符=“")
然后创建3D数组:
intensity_array2 = np.zeros ( 10,256,num_wavlengths)
然后填写3D数组的值:
intensity_array2[ data:,0,data:,1,:] = data:,2:
这不完全是因为x和y索引可能为负值--在这种情况下,您可能需要添加一个偏移量。另外,如果输入文件的格式是可预测的,那么您可以简单地调用数据矩阵上的np.reshape()来获取所需的内容。
https://stackoverflow.com/questions/25478428
复制相似问题