2009-11-06 121 views
10

为什么下面的行不能像我所期望的那样工作?为什么双层数numpy数组的赋值不起作用?

import numpy as np 
a = np.array([0,1,2,1,1]) 
a[a==1][1:] = 3 
print a 
>>> [0 1 2 1 1] 
# I would expect [0 1 2 3 3] 

这是'错误'还是有另一种推荐的方式呢?

在另一方面,下面的工作:

a[a==1] = 3 
print a 
>>> [0 3 2 3 3] 

干杯,菲利普

回答

7

看来你根本无法通过这样的双层进行分配。

这工作虽然:

a[numpy.where(a==1)[0][1:]] = 3 
4

由于一个并[a == 1]的部分是不实际的切片。它创建一个新的数组。当你考虑它的时候是有道理的 - 你只需要满足布尔条件的元素(如过滤操作)。

+0

我添加了第二个例子,像我期望的那样工作。我真的没有看到区别。该作业不应该“通过”? – 2009-11-06 13:46:01

+2

我不认为这是正确的。如果你做'a [a == 1] = 3',那实际上会改变a的内容。 – 2009-11-06 13:47:30

+1

@Dave - 我认为这是perimosocodiae是正确的,并且你的反例是由于更像是在numpy内部的黑客创建一个就地操作的外观。 – tom10 2009-11-06 16:12:01

0

这你想要做什么

a[2:][a[2:]==1]=3 
+1

但是这需要事先知道1的第一次出现在位置1. – 2009-11-06 14:01:09

10

它涉及到索引多么花哨的作品。有一个彻底的解释here。这样做是为了允许用花式索引进行就地修改(即a[x>3] *= 2)。这样做的结果是,你不能像你找到的那样分配给双重索引。花式索引总是返回一个副本而不是一个视图。

+0

实际上,您的解决方案会修改第一次出现1,这不是他想要的。 – 2009-11-06 14:03:12

+0

右键 - 在您的评论前摘下它。 Ps hi菲利普它是罗宾! – robince 2009-11-06 14:16:13

+0

嘿罗宾 - 在这里见面有什么机会......慕尼黑欢呼! – 2009-11-06 14:49:18