2016-07-22 13 views
1

小塊切片例如S=np.s_[1:-1]; V=A[1:-1],產生底層數組的視圖。我可以通過V.base找到這個底層數組。如果我將這樣的視圖傳遞給一個函數,例如如果我將一個ndarray視圖傳遞給一個函數,我可以找到它的基礎,但是如何找到該切片?

def f(x): 
    return x.base 

then f(V) == A。但是我怎樣才能找到切片信息S?我正在尋找類似base的屬性,其中包含創建此視圖的切片的信息。我希望能夠編寫一個函數,我可以傳遞一個數組的視圖,並返回從視圖計算出的同一個數組的另一個視圖。例如。我希望能夠將視圖轉移到一維數組的右側或左側。

回答

1

據我所知切片信息不存儲,但你也許能夠從視圖和基本屬性推斷出結論。

例如:

In [156]: x=np.arange(10) 
In [157]: y=x[3:] 
In [159]: y.base 
Out[159]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

In [160]: y.data 
Out[160]: <memory at 0xb1a16b8c> 
In [161]: y.base.data 
Out[161]: <memory at 0xb1a16bf4> 

我喜歡__array_interface__值更好:

In [162]: y.__array_interface__['data'] 
Out[162]: (163056924, False) 
In [163]: y.base.__array_interface__['data'] 
Out[163]: (163056912, False) 

所以y DataBuffer中開始的12個字節以後x。並且由於y.itemsize是4,這意味着切片開始是3

In [164]: y.shape 
Out[164]: (7,) 
In [165]: x.shape 
Out[165]: (10,) 

並且比較形狀,我推斷片斷是None(結束)。

對於二維陣列或階梯式切片,您還必須查看strides

但實際上,將切片對象(元組,切片等)傳遞給函數可能更容易,更安全,而不是從結果中推演出來。

In [173]: S=np.s_[1:-1] 
In [174]: S 
Out[174]: slice(1, -1, None) 
In [175]: x[S] 
Out[175]: array([1, 2, 3, 4, 5, 6, 7, 8]) 

也就是通過S本身,而不是推論它。我從來沒有見過它做過。

+0

我認爲只是通過S會打敗目的,但你提供了我需要的一個直觀的5線解決方案在1D。對於我來說,如果這種切片的使用確實在numpy中沒有預料到,這似乎很奇怪。 –

相關問題