2010-02-22 58 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]] 

調整大小()不會做的工作。

感謝, Tebas

+0

提出的問題+1 – 2010-02-22 15:44:30

回答

6

傳遞切片對象的元組做工作:

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

是的,這很好。複雜性是O(no_dims)並且沒有數據被複制:-) 謝謝! – Tebas 2010-02-22 15:26:20

+0

不客氣,這只是一個理解'__getitem__'方法得到什麼參數的問題:-) – fortran 2010-02-22 15:27:55

+0

@Tebas,非常感謝,但是您應該_accept_這個好的和有用的答案(使用複選標記形狀的圖標根據答案左邊的數字) - 這是至關重要的堆棧溢出禮節! – 2010-02-22 15:46:09

2

簡單的解決方案:

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

我已經在Thomas上標記了+1,並且Fortran – 2010-02-22 15:42:49

+0

縮短了一點,但是使用生成器表達式而不是map會稍微好一些,因爲不需要中間列表:-) – fortran 2010-02-22 17:31:29