2011-05-05 78 views
0

給定一個numpy數組和一個__getitem__類型的索引,是否有一種慣用的方法來獲取數組的相應切片,總是返回一個數組,而不是一個標量numpy切片總會返回一個數組

有效索引的示例包括:intslice,省略號或上述元組。

說我有這樣一個數組:

a = np.array([[1,2],[3,4]]) 

我正在尋找一個在所有情況下等效於a[whatever]的操作,除非a[whatever]返回一個標量(例如,a[1,1])。在這些情況下,我希望這種替代操作能夠返回單元素數組。

+2

可能值得澄清的是,你想要一個一維向量代替一個標量,我認爲這是暗示的。 (因爲單元素數組可以有任意數量的維度)。在過去,我必須要求任何一張二維表*總是*返回一張二維表,在這種情況下,我在自己編寫的'table'類中使用了'numpy.atleast_2d',它鏡像了許多'array'方法。如果你能夠從一個numpy數組中獲得'atleast_ * D'行爲,它可能會破壞所有類型的東西。 – Paul 2011-05-05 18:53:04

+2

我能想到的一個可能的用途是當你總是希望結果是一個視圖,以便修改它改變原來的。如果這是所期望的,'atleast_Nd'不夠好 - 可能需要將'int'索引轉換爲'slice'。 – kwatford 2011-05-05 19:03:10

回答

5

如果您只是想在返回標量的情況下返回單元素數組,那麼爲什麼不使用numpy.atleast_1d作爲片的結果呢?

如:

import numpy as np 
x = np.arange(100).reshape(10,10) 
print x[0,0] 
print np.atleast_1d(x[0,0]) 
print np.atleast_1d(x[:,:3]) 
+0

感謝您的支持。有沒有一種簡潔的方式來保存數組的類型(我使用'ndarray'的子類,並希望結果與'x'類型相同)。 – NPE 2011-05-06 12:52:14

+0

我也應該注意到,我並不總是知道'x' *的類型先驗*。 – NPE 2011-05-06 13:12:39

+0

@aix - 不幸的是,據我所知,沒有'np.atleast_1d'的np.asanyarray等價物。 @Sven的答案可能是你最好的選擇,如果你需要始終保持陣列的類型。由於它總是會返回一個片段,因此應該保留該類型。 – 2011-05-06 16:44:56

0

除了np.array(a[whatever])?不要認爲有比這更簡單/更習慣的方式。

+0

實際上,這並不是OP所要做的(例如,當切片的結果是標量時,請查看結果數組的形狀。) – 2011-05-05 18:31:15

2

下面是一個稍微複雜一些的版本,它總是返回一個視圖到原來的數組(當然前提是你沒有做任何的高級索引,這應該由你的規範保證的有效指數):

def get(a, item): 
    if not isinstance(item, tuple): 
     item = (item,) 
    if len(item) == a.ndim and all(isinstance(x, int) for x in item): 
     return a[item + (None,)] 
    else: 
     return a[item]