将.txt数据加载入10x256 3d numpy数组

1 投票
2 回答
773 浏览
提问于 2025-04-18 18:24

我正在尝试把一些文本文件加载到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) = 10len(unique_x) = 256是在上面的一个函数中找到的。

2 个回答

1

我不是很确定我完全理解你的文件格式,所以如果我说的不对,请多包涵。不过,如果你能一次性加载所有数据,我相信这样会运行得更快。看起来你可以用下面这行代码把所有数据加载到内存中:

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() 来得到你想要的结果。

0

在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:]

这只是把前两个索引的信息扔掉了。如果你需要保留这些信息,就得用一些更复杂的方法了。

撰写回答