numpy sub-gridding декартово произведение - PullRequest
0 голосов
/ 03 марта 2012

Итак, у меня есть декартово произведение c двух (или более) векторов a и b. Я хочу получить декартово произведение a [:: i] и b [:: j] из c.

Это означает, что новый декартовой продукт пропустит каждый i-й элемент и каждый j-й b-элемент.

Например

veclens = (3,6)

# <code that generates cross product c here> (I have that). 
# result:
c = array([
[0,0],
[0,1],
[0,2],
[0,3],
[0,4],
[0,5],
[1,0],
[1,1],
[1,2],
[1,3],
[1,4],
[1,5],
[2,0],
[2,1],
[2,2],
[2,3],
[2,4],
[2,5]])

print c.shape 
(18, 2)

samples = (2,2) # so we want every 2nd item a, and every 2nd in b

# this is the function I would like:
d = get_subarray(c, samples, veclens)

# and now d is something like
array([
[0,0],
[0,2],
[0,4],
[2,0],
[2,2],
[2,4]])

Любая идея, как написать get_subarray без вычисления массива c с нуля (что дорого, потому что на самом деле это функция, вычисляемая по перекрестному продукту a и b). Конечно, есть какой-то трюк с индексированием?

Я ищу что-то вроде следующего, но более общего, более элегантного и быстрого.

def get_subarray(c, samples, veclens):
    indexes = []
    for i in range(0, veclens[0], samples[0]):
        for j in range(0, veclens[1], samples[1]):
            indexes.append(i * veclens[1] + j)
    return c[indexes]

1 Ответ

0 голосов
/ 04 марта 2012

Вот общее решение с использованием ix _:

def get_subarray(c, samples, veclens):
    n = len(veclens)
    d = c.reshape(veclens+[n])
    i = numpy.ix_(*[range(0, l, s) for l,s in zip(veclens,samples)]
    return d[i].reshape((-1,n)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...