将点列表转换为numpy二维数组

8 投票
4 回答
3567 浏览
提问于 2025-04-16 17:53

我正在使用genfromtxt这个工具来导入一个基本上是二维数组的数据,这些数据都保存在一个文本文件里,格式是这样的(x和y都是整数):

    x1   y1   z1
    x2   y2   z2
    :    :    :

我现在用下面这个for循环来处理这些数据,但我觉得应该有一种更简单的方法可以在一行内完成。有没有更高效的方式来进行这个转换呢?

raw = genfromtxt(file,skip_header = 6)

xrange = ( raw[:,0].min() , raw[:,0].max() )
yrange = ( raw[:,1].min() , raw[:,1].max() )

Z = zeros(( xrange[1] - xrange[0] +1 , yrange[1] - yrange[0] +1 ))

for row in raw:
    Z[ row[0]-xrange[0] , row[1]-yrange[0] ] = row[2]

4 个回答

0

要从文件中导入一个矩阵,你可以先把每一行分开,然后把它们转换成整数。

[[int(i) for i in j.split()] for j in open('myfile').readlines()]

当然,我是指你的文件里只包含这个矩阵。

最后,你可以把这个二维数组转换成numpy格式。

0

你可以试试这样做:

>>> Z = zeros((3, 3))
>>> test = array([[0, 1, 2], [1, 1, 6], [2, 0, 4]])
>>> Z[test[:, 0:2].T.tolist()]
array([ 0.,  0.,  0.])
>>> Z[test[:, 0:2].T.tolist()] = test[:, 2]
>>> Z
array([[ 0.,  2.,  0.],
       [ 0.,  6.,  0.],
       [ 4.,  0.,  0.]])

在你的情况下:

Z[(raw[:, 0:2] - minimum(raw[:, 0:2], axis=0)).T.tolist()] = raw[:, 2]
3

你可以用下面的代码来替代这个for循环:

xidx = (raw[:,0]-xrange[0]).astype(int)
yidx = (raw[:,1]-yrange[0]).astype(int)

Z[xidx, yidx] = raw[:,2]

撰写回答