2016-06-13 24 views
1

我不确定正确的术语来搜索以找到正确的优化。我想将下面最后四行代码简化为两行,其中+/- 1的添加分别在赋值为plusminus变量时完成。在分配期间修改numpy索引

# generic params to simulate loop conditions 
    position = np.arange(10) 
    axis = 2 

    # actual code to optimise 
    plus = np.asarray(position) 
    plus[axis] += 1 
    minus = np.asarray(position) 
    minus[axis] -= 1 

为了澄清这是一个迭代的问题:不采用通用positionaxis变量是错的,即明确以下的任何解决方案都没有解决方案:

plus = np.asarray([0,1,3,3,4,5,6,7,8,9]) 
plus = np.asarray(range(axis)+[position[axis]+1]+range(axis+1,len(position))) 

回答

1

下面是一个使用np.in1d到的方法冷凝那些四行两个 -

mask = np.in1d(np.arange(position.size),axis) 
plus, minus = position + mask, position - mask 

采样运行

让我们来测试它的通用position阵列与其他指数6 -

In [60]: position 
Out[60]: array([1, 0, 6, 8, 1, 7, 1, 3, 1, 6]) 

In [61]: axis = 6 

In [62]: mask = np.in1d(np.arange(position.size),axis) 

In [63]: plus, minus = position + mask, position - mask 

In [64]: plus 
Out[64]: array([1, 0, 6, 8, 1, 7, 2, 3, 1, 6]) # Change at 6th index 

In [65]: minus 
Out[65]: array([1, 0, 6, 8, 1, 7, 0, 3, 1, 6]) # Change at 6th index 
+0

出于本能,我还以为你骗用'np.arange(position.size)'!这实际上是一个非常好的解决方案,并且**完全**我之后的事情。 *虽然只是将它们组合在一个元组中,但在我的书中肯定会作弊,因为我们不妨使用分号! (:* - 我也喜欢布尔逻辑使用框外的好想法 –

+0

@AlexanderMcFarlane那么,如果你是那么严格,你可以做'position + np.in1d(np.arange(position.size),axis)'和'position - np.in1d(np.arange(position.size),axis)'。但是这有点冗余代码。所以,你知道:) – Divakar

+0

touché:要严格执行*两行*的要求,你有一个选择低效的代码或偷偷摸摸的捷径。我怀疑这可能是错误的代码写入两行,但我希望解决方案就地管理,所以谢谢! –