Numpy: изменение этого массива за наименьшее количество операций - PullRequest
2 голосов
/ 27 января 2011

У меня есть массив со 112 строками и 40 столбцами.

Формат, который мне нужно преобразовать, - это 40 наборов по 56 точек, каждый с x, y.

Итак, первая строкаимеет координаты х первой точки в каждом наборе.Вторая строка имеет х вторых точек в наборе ... до 56-й строки.После этого у меня есть y.

1st line : 40 x's  
2nd line: 40 x's  
...  
56th line: 40 x's  
57th line: 40 y's  
...  
112th line: 40 y's  

Изначально я думал о выполнении data.reshape(40, 56, 2), но это не сработало, потому что значения для x предшествуют значениям для y.Если бы вместо этого у меня была одна строка с х и другая с у, это бы сработало.

Редактировать:

for i in xrange(len(data)/2):
    points.append(data[i])
    points.append(data[i+len(data)/2])
points = np.array(points).T.reshape(len(data[0]), len(data)/2, 2)
return points

Ответы [ 2 ]

4 голосов
/ 27 января 2011

Всего одна идея:

[[(data[i,j], data[i+56,j]) for i in range(56)] for j in range(40)]

Возвращает список списка кортежей.

РЕДАКТИРОВАТЬ: Ваше редактирование уточняет, что вы хотите.Если вы хотите чистый Numpy, тогда это работает?

data.reshape(2, 56, 40).swapaxes(0,2)
2 голосов
/ 27 января 2011

Я буду использовать меньший массив (8 x 5), чтобы мы могли легко просматривать возвращаемые значения.

import numpy as NP

# just create a smaller array to work with:
A = NP.random.randint(0, 10, 40).reshape(8, 5)

# split A in half, to separate x and y 
p, q = NP.vsplit(A, 2)

# create a 'template' array of the correct dimension
xy = NP.zeros(2, 4, 5)

# now just map the x and y values onto the template
xy[0:,:] = p
xy[1:,:] = q


# the transformed matrix:
array([[[ 8.,  5.,  2.,  5.,  7.],
        [ 2.,  6.,  0.,  7.,  2.],
        [ 4.,  4.,  7.,  5.,  5.],
        [ 8.,  5.,  2.,  0.,  5.]],

       [[ 4.,  8.,  6.,  9.,  2.],
        [ 2.,  6.,  5.,  8.,  1.],
        [ 3.,  2.,  6.,  2.,  2.],
        [ 1.,  8.,  0.,  7.,  3.]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...