簡體   English   中英

將點列表轉換為numpy 2D數組

[英]Converting a list of points to a numpy 2D array

我正在使用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]

您可以使用以下內容替換for循環:

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

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

你也可以使用numpy.searchsorted ,它也允許非等間距/浮點數據:

raw = genfromtxt(file,skip_header = 6)

xvalues = numpy.sorted(set(raw[:,0]))
xidx = numpy.searchsorted(xvalues, raw[:,0])

yvalues = numpy.sorted(set(raw[:,1]))
yidx = numpy.searchsorted(yvalues, raw[:,1])

Z = numpy.zeros((len(xvalues), len(yvalues)))
Z[xidx, yidx] = raw[:,2]

否則,我會關注西蒙的回答。

要從文件導入矩陣,您只需拆分行然后轉換為int。

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

當然,我假設你的文件只包含矩陣。

最后,您可以將此二維數組轉換為numpy。

你可以嘗試這樣的事情:

>>> 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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM