Нарезка во время выполнения - PullRequest
3 голосов
/ 22 февраля 2010

Может кто-нибудь объяснить мне, как нарезать массив numpy.array во время выполнения? Я не знаю ранг (количество измерений) в «время кодирования».

Минимальный пример:

import numpy as np
a = np.arange(16).reshape(4,4) # 2D matrix
targetsize = [2,3] # desired shape

b_correct = dynSlicing(a, targetsize)
b_wrong = np.resize(a, targetsize)

print a
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
print b_correct
[[0 1 2]
 [4 5 6]]
print b_wrong
[[0 1 2]
 [3 4 5]]

И мой безобразный dynSlicing ():

def dynSlicing(data, targetsize):
    ndims = len(targetsize)

    if(ndims==1):
        return data[:targetsize[0]],
    elif(ndims==2):
        return data[:targetsize[0], :targetsize[1]]
    elif(ndims==3):
        return data[:targetsize[0], :targetsize[1], :targetsize[2]]
    elif(ndims==4):
        return data[:targetsize[0], :targetsize[1], :targetsize[2], :targetsize[3]]

Resize () не будет выполнять эту работу, так как он переносит массив перед удалением элементов.

Спасибо, Tebas

Ответы [ 3 ]

6 голосов
/ 22 февраля 2010

Передача кортежа объектов-срезов делает работу:

def dynSlicing(data, targetsize):
    return data[tuple(slice(x) for x in targetsize)]
2 голосов
/ 22 февраля 2010

Простое решение:

b = a[tuple(map(slice,targetsize))]
1 голос
/ 22 февраля 2010

Вы можете напрямую «изменить» его. Это связано с тем, что массивы разрешают только фон.

Вместо этого вы можете скопировать раздел или, что еще лучше, создать вид нужной фигуры http://www.scipy.org/Tentative_NumPy_Tutorial#head-1529ae93dd5d431ffe3a1001a4ab1a394e70a5f2

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