首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于图像处理的Nx3列数据到二维矩阵

用于图像处理的Nx3列数据到二维矩阵
EN

Stack Overflow用户
提问于 2012-05-01 19:46:59
回答 1查看 711关注 0票数 1

我试图以Nx3数据的格式(“x”、“y”、“value”)从文本文件中找到局部最大值和可数线;'x‘和'y’形成一个间隔均匀的网格,并且对于'x‘、'y’的每一个组合都有一个值,如下所示:

代码语言:javascript
复制
  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矩阵格式进行图像处理。这是守则的有关部分:

代码语言:javascript
复制
# 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)

有人能帮我把我的数据转换成所需的“网格”格式吗?

编辑:,我最终选择了熊猫,但我发现在一般的case.This中选择的答案更好,这就是我所做的:

代码语言:javascript
复制
from pandas import read_csv
data=read_csv(filename, names=['x','y','values']).pivot(index='x', columns='y',
              values='values')

在此之后,data.values就像我想要的那样,以2d的“图像形式”保存表。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-02 12:45:53

最好的解决办法确实取决于你不给予的细节。顺便说一句,您应该使用给出您的代码,或者至少给出np.loadtxt指令。在以下内容中,"data“是使用以下方法从文件中加载的数组:

代码语言:javascript
复制
data = np.loadtxt('file.txt', [('x',float), ('y',float), ('value',float)])

1)直接重塑:

跟着@tom10说的话

如果您知道您的(x,y,value)数据按特定顺序存储:

代码语言:javascript
复制
[(x0,y0,v00), (x0,y1,v01), .... , (x1,y0,v10),(x1,y1,v11), ... ,(xN,yM,vNM)]

并给出了所有(x,y)对的值。那么最好的方法是从您的值列表中创建一个一维numpy数组,并对其进行整形:

代码语言:javascript
复制
x = np.unique(data['x'])
y = np.unique(data['y'])
r = data['value'].reshape((x.size,y.size))

2)一般案件:

有关类似问题和使用字典的其他解决方案,请参见https://stackoverflow.com/questions/6150375/populate-arrays-in-python-numpy

如果您不能保证除了(x,y,value)元组以外的其他任何东西:

代码语言:javascript
复制
# indexing: list of x and y coordinates, and functions that map them to index
x  = np.unique(data['x']).tolist()
y  = np.unique(data['y']).tolist()
ix = np.vectorize(lambda i: x.index(i), otypes='i')
iy = np.vectorize(lambda j: y.index(j), otypes='i')

# create output array
r  = np.zeros((x.size,y.size), float)   # default value is 0
r[ix(data['x']), iy(data['y'])] = data['value']

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

( 3)中级案件?

您可能有一个中间情况,在以特定顺序给定的常规网格坐标之间,而根本没有约束。在一般情况下,可能非常慢,您应该设计您的算法,以利用您的数据遵循的任何规则。

一个例子是,如果您知道x索引遵循特定的规则,但不一定是按顺序进行的。例如,如果您知道x和y是等距的“网格”坐标,则表单:

代码语言:javascript
复制
coordinate = min_coordinate + i*step

然后找到min_coordinate和step (对于x和y),并通过求解这个方程找到i。这样,就可以避免代价高昂的索引映射np.vectorized(.List.index(.))

代码语言:javascript
复制
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']
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10403341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档