【问题标题】:Loading .txt data into 10x256 3d numpy array将 .txt 数据加载到 10x256 3d numpy 数组中
【发布时间】:2014-10-18 03:53:11
【问题描述】:

我正在尝试将一些文本文件加载到 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() 遍历文件,并将变量 (x,y, lambda) 添加到一个新数组 3D numpy 数组中,每个变量都被分配一个强度值。另外,我认为如果 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 在上面的函数中找到。

【问题讨论】:

  • 如果有人知道如何简单地将值迭代地加载到 3x3 数组中,那将是一个好的开始:)

标签: python arrays numpy mapping spectral


【解决方案1】:

基于 Lukeclh 的回答,尝试:

data = np.genfromtxt(rf)

然后,切掉波长值

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

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

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

“-1”值表示“剩下的都在这里”。

我们仍然有前导值 (of 在每个数组上。要修剪它们,我们可以这样做:

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

这只是将前两个索引中的信息丢弃。如果你需要保留它,你将不得不做一些更复杂的事情。

【讨论】:

  • 实际上,我仍然收到这样的错误:第 #2561 行(得到 3025 列而不是 1725)
【解决方案2】:

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

data = np.genfromtxt(rf, delimiter = " ")

然后创建你的 3D 数组:

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

然后填写3D数组的值:

intensity_array2[ 数据[:,0], 数据[:,1], :] = 数据[:, 2:]

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

【讨论】:

  • 感谢您的回复!我尝试了您所说的,但对于 1 到 2561 的每一行,我都收到以下错误或类似错误:code Line #1694(得到 2944 列而不是 1725)这让我相信这些列可能并不完全相同大小...
  • 关于负指数,我不介意它们变成负数,如果我可以将它们从 0-9 和 0-255 重新标记,我完全可以接受。
猜你喜欢
  • 2018-12-15
  • 2021-07-15
  • 2020-03-13
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多