我正在尝试从文本文件中读取的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
  ...


问题是我尝试使用的图像代码(link)要求数据采用不同的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

最佳答案

最好的解决方案实际上取决于您不提供的详细信息。顺便说一句,您应该真正给出您的代码,或者至少给出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)对的值。最好的办法是从值列表中创建一维numpy数组,然后对其进行整形:

x = np.unique(data['x'])
y = np.unique(data['y'])
r = data['value'].reshape((x.size,y.size))


2)一般情况:

有关类似问题,请参见Populate arrays in 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)中级案件?

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

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

coordinate = min_coordinate + i*step


然后找到min_coordinate和step(对于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']

10-08 07:56
查看更多