Python Nx3列数据转换为2d矩阵,用于图像处理

Python Nx3列数据转换为2d矩阵,用于图像处理,python,image-processing,numpy,scikits,Python,Image Processing,Numpy,Scikits,我试图从一个文本文件中读取Nx3数据的格式('x','y','value')中查找局部最大值和计数;'x'和y'构成一个均匀分布的网格,并且x'和y'的每个组合都有一个值,看起来如下所示: 3.0, -0.4, 56.94369888305664 3.0, -0.3, 56.97200012207031 3.0, -0.2, 56.77149963378906 3.0, -0.1, 56.41230010986328

我试图从一个文本文件中读取Nx3数据的格式('x','y','value')中查找局部最大值和计数;'x'和y'构成一个均匀分布的网格,并且x'和y'的每个组合都有一个值,看起来如下所示:

  3.0, -0.4, 56.94369888305664        
  3.0, -0.3, 56.97200012207031        
  3.0, -0.2, 56.77149963378906        
  3.0, -0.1, 56.41230010986328        
  3.0,  0,   55.8302001953125       
  3.0,  0.1, 55.81560134887695        
  3.0,  0.2, 55.600399017333984        
  3.0,  0.3, 55.51969909667969        
  3.0,  0.4, 55.18550109863281         
  3.2, -0.4, 56.26380157470703 
  3.2, -0.3, 56.228599548339844
  ...
问题是,我尝试使用的图像代码()要求数据采用不同的2d矩阵格式进行图像处理。这是守则的相关部分:

# Construct some test data
x, y = np.ogrid[-np.pi:np.pi:100j, -np.pi:np.pi:100j]
r = np.sin(np.exp((np.sin(x)**3 + np.cos(y)**2)))

# Find contours at a constant value of 0.8
contours = measure.find_contours(r, 0.8)
有人能帮我把数据转换成所需的“网格”格式吗

编辑:我最终选择了熊猫,但在一般情况下,我发现选择的答案更好。我就是这么做的:

from pandas import read_csv
data=read_csv(filename, names=['x','y','values']).pivot(index='x', columns='y',
              values='values')
在此之后,
data.values
以我想要的2d“图像形式”保存表格

y   -0.4        -0.3        -0.2        -0.1
x               
3.0  86.9423     87.6398     87.5256     89.5779
3.2  76.9414     77.7743     78.8633     76.8955
3.4  71.4146     72.8257     71.7210     71.5232

对于您正在使用的程序,您只需要将数据设置为
z
值的矩形数组(在示例中,它们只使用x和y来构造z,但不再使用它们)。看起来您的数组是9乘N(其中N是您没有显示的内容)。一种简单的方法是将数据作为z值的平面集合读取,跳过x,y值,
restrape
来设置所需的形状。(我无法为此编写代码,因为您没有提供足够的信息,但这并不困难。)

最佳解决方案实际上取决于您没有提供的详细信息。顺便说一句,您应该真正给出您的代码,或者至少给出np.loadtxt指令。 在以下示例中,“数据”是使用从文件加载的数组:

data = np.loadtxt('file.txt', [('x',float), ('y',float), ('value',float)])
1) 直接整形: 跟随@tom10所说的内容
如果您知道(x,y,value)数据是按特定顺序存储的:

[(x0,y0,v00), (x0,y1,v01), .... , (x1,y0,v10),(x1,y1,v11), ... ,(xN,yM,vNM)]
并且给出了所有(x,y)对的值。然后,最好是从值列表中创建1D numpy数组并对其进行重塑:

x = np.unique(data['x'])
y = np.unique(data['y'])
r = data['value'].reshape((x.size,y.size))
2) 一般情况: 有关类似问题和使用字典的其他解决方案,请参阅

如果您不能保证除了具有(x,y,value)元组以外的任何内容:

注:在上述参考文献中,给出了使用字典的另一种方法。我认为这更具可读性,但我没有测试它们的相对速度

3) 中间病例? 您可能会有一个中间情况,介于按特定顺序给定的规则栅格坐标和完全没有约束之间。一般情况下可能非常慢,您应该设计算法以利用数据遵循的任何规则

例如,如果您知道x-y索引遵循特定规则,但不一定按顺序给出。例如,如果您知道x和y是等间距的“栅格”坐标,其形式如下:

coordinate = min_coordinate + i*step
然后求min\u坐标步长(对于x和y),并通过求解此方程求i。这样,就避免了代价高昂的索引映射np.vectoriated(…list.index(…):


我不太明白你的原始数据是什么。它看起来像一个元组列表,但是元组之间缺少逗号。这就是文本文件中数据的样子吗?这是numpy.loadtxt的输出,文本文件中的数据是这样的:3-0.4-0.0494273 56.9437 1.88357;3 -0.3 -0.0258483 56.972 2.03781; 3 -0.2 -0.00939226 56.7715 1.90159; 3 -0.1 0.00208286 56.4123 1.56543; “;”代表行的结尾,我只选择了第一、第二和第四列。我明白了,似乎我完全误解了这个问题,对不起。回答得很好,谢谢!顺便问一下,您是否也发现numpy.loadtxt相对较慢?谢谢。我不经常使用loadtxt,也从不使用大文件,所以我不知道它的效率。我希望它能以最快的速度加载文本数据。
coordinate = min_coordinate + i*step
x  = np.unique(data['x'])
y  = np.unique(data['y'])
ix = (data['x']-x.min())/(x[1]-x[0])
iy = (data['y']-y.min())/(y[1]-y[0])

# create output array
r  = np.ones((x.size,y.size), float)*np.nan   # default value is NaN
r[ix.astype(int), iy.astype(int)] = data['value']