2010-02-22 9 views
3

может кто-нибудь объяснить мне, как нарезать 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

+0

Хорошо представленный вопрос +1 –

ответ

6

Passing кортеж объектов ломтиков делает работу:

def dynSlicing(data, targetsize): 
    return data[tuple(slice(x) for x in targetsize)] 
+0

Да, это хорошо. Сложность - O (no_dims), и данные не копируются :-) Спасибо! – Tebas

+0

приветствуется, это просто вопрос понимания того, что метод '__getitem__' получал как аргумент :-) – fortran

+0

@Tebas, спасибо, хорошо, но вы должны _принять этот хороший и полезный ответ (используйте значок в виде галочки под номером слева от ответа) - это очень важно, чтобы этикет был переполнен! –

1

Вы можете непосредственно 'изменить' это. Это связано с характером массивов, только позволяя фон.

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

+0

Но как это помогает? Вопрос был о том, как разрезать, если ранг неизвестен в момент написания кода. Просто ищите необычную альтернативу dynSlicing(). – Tebas

2

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

b = a[tuple(map(slice,targetsize))] 
+0

Я отметил +1 на Томасе и fortran –

+0

немного короче, но немного лучше использовать выражение генератора вместо карты, потому что промежуточный список не нужен :-) – fortran

Смежные вопросы