1

我试图在我从文本文件中读取的格式('x','y','value')的 Nx3 数据中找到局部最大值和计数;'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
  ...

问题是我尝试使用的图像代码(链接)要求数据采用不同的二维矩阵格式进行图像处理。这是代码的相关部分:

# 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以我想要的二维“图像形式”保持表格。

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
4

2 回答 2

2

最好的解决方案实际上取决于您不提供的细节。顺便说一句,你真的应该给出你的代码,或者至少给出 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) 一般情况:

请参阅在 python (numpy) 中填充数组?对于类似的问题和使用字典的其他解决方案

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

# 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) 中间案例?

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

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

coordinate = min_coordinate + i*step

然后找到min_coordinatestep(对于 x 和 y),并通过求解这个方程找到i 。这样,您可以避免昂贵的索引映射np.vectorized(... list.index(...))

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']
于 2012-05-02T12:45:53.757 回答
1

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

于 2012-05-01T20:49:32.973 回答