在分配期间修改numpy索引
问题描述:
我不确定正确的术语来搜索以找到正确的优化。我想将下面最后四行代码简化为两行,其中+/- 1
的添加分别在赋值为plus
和minus
变量时完成。在分配期间修改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
为了澄清这是一个迭代的问题:不采用通用position
或axis
变量是错的,即明确以下的任何解决方案都没有解决方案:
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)))
答
下面是一个使用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
出于本能,我还以为你骗用'np.arange(position.size)'!这实际上是一个非常好的解决方案,并且**完全**我之后的事情。 *虽然只是将它们组合在一个元组中,但在我的书中肯定会作弊,因为我们不妨使用分号! (:* - 我也喜欢布尔逻辑使用框外的好想法 –
@AlexanderMcFarlane那么,如果你是那么严格,你可以做'position + np.in1d(np.arange(position.size),axis)'和'position - np.in1d(np.arange(position.size),axis)'。但是这有点冗余代码。所以,你知道:) – Divakar
touché:要严格执行*两行*的要求,你有一个选择低效的代码或偷偷摸摸的捷径。我怀疑这可能是错误的代码写入两行,但我希望解决方案就地管理,所以谢谢! –