2016-08-26 28 views
4

隨着我的代碼,我遇到了一個問題,其中numpy.choose方法不接受所有參數,因爲它受NPY_MAXARGS=32)的限制。是否有可用的替代方案,允許任意數量的自變量數組或至少超過32,與numpy.choose一樣快?numpy.choose的替代方案允許任意或至少多於32個參數?

choices = [np.arange(0,100)]*100 
selection = [0] * 100 
np.choose(selection, choices) 

>> ValueError: Need between 2 and (32) array objects (inclusive). 

任何幫助,將不勝感激... :)

+1

給出使用'choose'的現實原因。你的例子只是表明選擇的數量是有限的。你使用什麼特殊功能?請注意其文檔中的「濫用」警告。 – hpaulj

回答

4

該指數可以作爲列表。假設selections具有相同的長度choices

b = numpy.array(choices) 
result = b[range(len(selections)), selections] 

會給在由選擇索引指定選擇的值。看到它的行動:

numpy.random.seed(1) 
b = numpy.random.randint(0,100,(5,10)) 
>>> array([[37, 12, 72, 9, 75, 5, 79, 64, 16, 1], 
      [76, 71, 6, 25, 50, 20, 18, 84, 11, 28], 
      [29, 14, 50, 68, 87, 87, 94, 96, 86, 13], 
      [ 9, 7, 63, 61, 22, 57, 1, 0, 60, 81], 
      [ 8, 88, 13, 47, 72, 30, 71, 3, 70, 21]]) 

selections = numpy.random.randint(0,10,5) 
>>> array([1, 9, 3, 4, 8]) 

result = b[range(len(selections)),selections] 
>>>> array([12, 28, 68, 22, 70]) 
+0

這是我記得'選擇'作爲備選答案的唯一背景。 – hpaulj

1

choose具有32對象限制,因爲其廣播的陣列一起。考慮這兩個動作的錯誤消息:

In [982]: np.arange(33).choose(np.ones((33,33))) 
... 
ValueError: Need at least 1 and at most 32 array objects. 
In [983]: np.broadcast(*range(33)) 
... 
ValueError: Need at least 1 and at most 32 array objects. 

一個利用該廣播的例子,從2d數組,1d和標量中挑選值。

In [998]: np.diag([2,1,0]).choose((np.arange(9).reshape(3,3), 0,[.1,.2,.3])) 
Out[998]: 
array([[ 0.1, 1. , 2. ], 
     [ 3. , 0. , 5. ], 
     [ 6. , 7. , 8. ]]) 

作爲@Benjamin所示np.choose可以用來選擇來自2D陣列的連續列項 - 提供有不超過32分列

In [1002]: M=np.arange(9).reshape(3,3) 
In [1003]: np.array([2,0,1]).choose(M) 
Out[1003]: array([6, 1, 5]) 
In [1004]: M[[2,0,1],[0,1,2]] 
Out[1004]: array([6, 1, 5]) 

正是在這樣一個上下文我記得第一次看到這個32數組限制爲choose,並且我在其中看到choose用於答案中的少數幾個之一。

這是一個編譯功能,PyArray_Choosearray_choose

https://github.com/numpy/numpy/blob/0b2e590ec18942f8f149ab2306b80da86b04eaeb/numpy/core/src/multiarray/item_selection.c

https://github.com/numpy/numpy/blob/945c308e96fb815729e8f8aeb0ad6b39b8bdf84a/numpy/core/src/multiarray/methods.c

我沒有看到這個功能的任何使用其它編譯numpy的代碼。除了測試,在numpy的其餘部分幾乎沒有用處。

相關問題