Преобразование списка точек в простой массив 2D - PullRequest
7 голосов
/ 18 мая 2011

Я использую genfromtxt для импорта по существу двумерного массива, все значения которого перечислены в текстовом файле вида (x и y - целые числа):

    x1   y1   z1
    x2   y2   z2
    :    :    :

Я используюЦикл ниже, но я уверен, что для этого должен быть однострочный способ.Что было бы более эффективным способом сделать это преобразование?

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 ]

3 голосов
/ 18 мая 2011

Вы можете заменить цикл for следующим:

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

Z[xidx, yidx] = raw[:,2]
0 голосов
/ 14 мая 2014

Вы также можете пойти с 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]

В противном случае, я буду следовать ответу Саймона.

0 голосов
/ 18 мая 2011

Вы можете попробовать что-то вроде этого:

>>> 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]
0 голосов
/ 18 мая 2011

Чтобы импортировать матрицу из файла, вы можете просто разбить строки, а затем преобразовать в int.

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

конечно, я полагаю, ваш файл содержит только матрицу.

В конце вы можете преобразовать этот двумерный массив в numpy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...