将.text数据加载到10x256 3d numpy数组中

时间:2014-08-25 02:54:58

标签: python arrays numpy mapping spectral

我试图将一些文本文件加载到numpy数组中。 .txt文件表示图像的像素,其中每个像素被赋予-10和+10(对于x)和0和10之间的任意相对坐标。总的来说,图像是10x256像素。问题在于,每个像素都没有给出RGB值,它被给出一个强度列表,该列表对应于第一个/ n个分离的标题中的波长值#34;。每个坐标作为两个第一个制表符分隔项,第一个条目只有" 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) = 10len(unique_x) = 256的位置。

2 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解您的文件格式,所以如果这没有意义,请原谅我。但是,如果有任何方法可以立即加载所有数据,我相信它会运行得更快。在我看来,您可以使用它来将所有数据存入内存:

data = np.genfromtxt(rf,delimiter =“”)

然后创建3D数组:

intensity_array2 = np.zeros((10,256,num_wavlengths))

然后填写3D数组的值:

intensity_array2 [data [:,0],data [:,1],:] = data [:,2:]

这不会完全正常,因为您的x和y索引可能会变为负数 - 在这种情况下您可能需要添加偏移量。此外,如果您的输入文件采用可预测的格式,您可以简单地在数据矩阵上调用np.reshape()来获得您想要的内容。

答案 1 :(得分:0)

在Lukeclh的回答基础上,尝试:

data = np.genfromtxt(rf)

然后,切断波长值

wavelengths = data[0]
intensities = data[1:]

我们现在可以使用重塑来重新排列数据:

intensitiesshaped = np.reshape(intensities, (len(unique_x),len(unique_y),-1))

“-1”值表示“其余的就在这里”。

我们仍然具有领先值(在每个阵列上都有。要修剪它们,我们可以这样做:

wavelengths = wavelengths[2:]
intensitiesshaped = intensities[:,:,2:]

这只会抛出前两个指数的信息。如果你需要保留它,你将不得不做一些更复杂的事情。