我试图从文本文件中读取格式('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
...
问题在于我尝试使用的图像代码(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
答案 0 :(得分:2)
最佳解决方案实际上取决于您不给予的细节。顺便说一下,你应该真的给你的代码,或者至少是np.loadtxt指令。 在下文中,“data”是使用以下文件从文件加载的数组:
data = np.loadtxt('file.txt', [('x',float), ('y',float), ('value',float)])
关注@ 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))
请参阅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']
注意:在上面给出的参考中,给出了使用字典的其他方法。我认为这更具可读性,但我没有测试它们的相对速度。
您可能有一个中间案例,在按特定顺序给出的常规网格坐标之间,根本没有约束。一般情况可能非常慢,您应该设计算法以利用数据遵循的任何规则。
一个例子是,如果您知道x-y索引遵循特定规则,但不一定按顺序给出。例如,如果您知道x和y是等间距的“网格”坐标,则格式为:
coordinate = min_coordinate + i*step
然后找到 min_coordinate 和步骤(对于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']
答案 1 :(得分:1)
对于您正在使用的程序,您只需要将数据设置为z
值的矩形数组(在示例中,它们只是使用x和y来构造z,但之后再也不使用它们)。看起来你的数组是9乘N(其中N是你没有显示的东西)。一个简单的方法就是将数据作为z值的平面集合读取,跳过x,y值reshape
来设置你想要的形状。 (我无法真正为此编写代码,因为您没有提供足够的信息,但这应该不难。)