2015-04-23 56 views
3

在比什么,我需要一个小规模的基于索引的每列的一个特定的元素,这里有什么,我希望做一个例子:NumPy的:设置由数组

>>> a 
array([[ 21, 22, 23, 24, 25, 26, 27], 
     [ 56, 57, 58, 59, 60, 61, 62], 
     [ 14, 15, 16, 17, 18, 19, 20], 
     [ 7, 8, 9, 1010, 11, 12, 13], 
     [ 42, 43, 44, 45, 46, 47, 48], 
     [ 63, 64, 65, 66, 67, 68, 69], 
     [ 0, 1, 2, 3, 4, 5, 6], 
     [ 49, 50, 51, 52, 53, 54, 55], 
     [ 28, 29, 30, 31, 32, 33, 34], 
     [ 35, 36, 37, 38, 39, 40, 41]]) 
>>> indices = a.argmax(axis=0) 
>>> indices 
array([5, 5, 5, 3, 5, 5, 5]) 
>>> b = np.zeros(a.shape) 
>>> b[indices] = 1.0 
>>> b # below is the actual output, not what I want 
array([[ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 1., 1., 1., 1., 1., 1., 1.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 1., 1., 1., 1., 1., 1., 1.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.]]) 

但我其实需要的是:

>>> b 
array([[ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 1., 1., 1., 0., 1., 1., 1.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0.]]) 

numpy的索引可以得到极其复杂,这是一个有点难以投入到上述情况的话,那么希望有人能明白我要找的。从本质上讲,只要在其他地方存在最大值和零值的情况下设置1。我会如何去做这件事?

回答

4

docs

如果在选择的元组对象的数量小于N,那么 :假定对于任何后续的尺寸。

在您的选择中,只有一个数组,因此您将索引中的每一行都等于1.为了克服这个问题,您需要列索引。我想这将这样的伎俩:

b[indices, np.arange(a.shape[1])] = 1.0 
+0

不错:-)我知道有一个班轮地方 –

+0

啊哈, 谢谢!我觉得我现在理解numpy索引更好一点。 – mjois

+0

谢谢你。我来自MATLAB,所以'0:a.shape [1]'我认为实际上会产生列索引,但是这会执行切片。在MATLAB中,':'运算符既进行切片,又生成一个索引向量,这是我的麻烦来自的地方。现在我知道我必须手动生成列索引。谢谢! – rayryeng

0

有可能是没有环的方式,但你总是可以做:

indices = a.argmax(axis=0) 
b = np.zeros(a.shape) 
for j,ind in enumerate(indices): 
    b[ind, j] = 1 
相关问题