Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将.txt数据加载到10x256 3d numpy数组中_Python_Arrays_Numpy_Mapping_Spectral - Fatal编程技术网

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

Python 将.txt数据加载到10x256 3d numpy数组中,python,arrays,numpy,mapping,spectral,Python,Arrays,Numpy,Mapping,Spectral,我正在尝试将一些文本文件加载到numpy数组中。txt文件表示图像的像素,其中每个像素都有一个介于-10和+10(对于x)以及0和10(对于y)之间的任意相对坐标。总的来说,图像是10x256像素。问题在于,每个像素没有给出RGB值,而是给出了与第一个/n分隔的“标题”中的波长值相对应的强度列表。每个坐标作为两个第一个制表符分隔的项目给出,第一个条目只有“0”,因为文本文件的格式如下: 第1行:“0 0 625.15360 625.69449 626.23538…”(两个坐标后跟波长) 第2行:

我正在尝试将一些文本文件加载到numpy数组中。txt文件表示图像的像素,其中每个像素都有一个介于-10和+10(对于x)以及0和10(对于y)之间的任意相对坐标。总的来说,图像是10x256像素。问题在于,每个像素没有给出RGB值,而是给出了与第一个/n分隔的“标题”中的波长值相对应的强度列表。每个坐标作为两个第一个制表符分隔的项目给出,第一个条目只有“0”,因为文本文件的格式如下:

第1行:“0 0 625.15360 625.69449 626.23538…”(两个坐标后跟波长)
第2行:“-10.00000-10.00000 839 841 833 843 838 847…”
第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)=10
len(unique_x)=256
可以在上面的函数中找到。

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

data=np.genfromtxt(右前,分隔符=)

然后创建3D阵列:

强度数组2=np.0((10,256,num长度))

然后填写三维阵列的值:

强度阵列2[数据[:,0],数据[:,1],:]=数据[:,2:]


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

基于Lukelh的答案,请尝试:

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

这只是将前两个索引中的信息扔掉。如果您需要保留它,您必须做一些更复杂的事情。

如果有人知道如何将值迭代加载到3x3数组中,这将是一个很好的开始:)感谢您的回复!我尝试了你所说的,但我从第1行到第2561行都出现了以下错误或类似的错误:
code
line#1694(得到2944列,而不是1725列)这让我相信,列的大小可能不尽相同……关于负索引,我并不介意它们变为负,如果我能将它们从0-9和0-255重新标记,我完全可以接受。事实上,我仍然会遇到这样一个错误:行#2561(得到3025列,而不是1725列)