2016-07-31 3 views
0

Ниже приведена функция, которая может возвращать подмножества из двух заданных матей. Позиция генерации этих подкатегорий одинакова для обоих входных матей. Входные маты составляют Numpy array. Я просто хотел бы знать, есть ли более элегантные способы выполнения той же задачи, что и эта функция.эффективный подход к генерации подматриц

def seg(ma1,ma2,size): 
    rowN = len(ma1)   
    colN = len(ma1[0])   
    dim1 = random.randint(0,rowN-size) 
    dim2 = random.randint(0,colN-size) 
    return ma1[dim1:dim1+size,dim2:dim2+size], ma2[dim1:dim1+size,dim2:dim2+size] 
+0

Единственное, что, я думаю, добавит «элегантность», это сделать '(rowN, colN) = ma1.size'. –

ответ

0

В качестве альтернативного подхода, мы могли бы создать индексирование диапазоны np.ix_ и индекса во входные массивы с тем, как так -

idx = np.ix_(np.arange(size)+dim1,np.arange(size)+dim2) 
out = ma1[idx], ma2[idx] 

Другой подход может быть предложено использовать np.mgrid для создайте плотные индексы строк и столбцов. Это потребует больше памяти, чем предыдущий, но, вероятно, ближе к исходному коду, хотя и короче. Вот как это будет выглядеть -

R,C = np.mgrid[dim1:dim1+size,dim2:dim2+size] 
out = ma1[R,C], ma2[R,C] 

Другим путь к «сдвигу» элегантность в np.mgrid и вытолкнуть нагрузку на последнюю индексацию часть будет, как так -

R,C = np.mgrid[:size,:size] 
out = ma1[R+dim1,C+dim2], ma2[R+dim1,C+dim2] 
0

Вы, вероятно, хотите сделать rowN, colN = ma1.shape вместо

rowN = Len (ma1)
ColN = LEN (ma1 [0])

Кроме того, вы м вы хотите засеять ваш генератор случайных чисел.