想知道是否有一种简单的方法可以做到这一点:
假设我有一个形状为(2,3,2)
的numpy数组,例如:
x =
[[[ 0, 1],
[ 2, 3],
[ 4, 5]],
[[ 6, 7],
[ 8, 9],
[10,11]]]
如果我想替换所有与axis=1
和position=0
相对应的条目,为零,我可以轻松地执行此操作:
x[:,0,:] = 0
x =
[[[ 0 0]
[ 2 3]
[ 4 5]]
[[ 0 0]
[ 8 9]
[10 11]]]
然而,如果我有一个我希望执行这些操作的轴列表。这有内置的numpy功能吗?理想情况下,它看起来像这样:
array_replace(array=x,axis=1,pos=0,replace_val=0)
哪个会给出与上面相同的数组。
我可以想办法通过展平矩阵和计算每个变量的位置将基于每个数组的维度来实现这一点,但我想知道numpy中是否已经存在某些东西。< / p>
答案 0 :(得分:2)
您可以构建切片元组,然后使用特定轴作为位置。所以你可以定义这样的函数:
def array_replace(array, axis, pos, replace_val):
array[(slice(None),) * axis + (pos,)] = replace_val
所以我们要做的是构建一个带有slice
对象{1}}的1元组。切片对象是Python在窗帘后面生成的冒号(slice(None),)
。因此:
是x[:,0,:]
的简单表示。
接下来,我们重复此切片x[(slice(None),0,slice(None))]
次(指定轴之前的次数),然后是我们想要的位置。其余切片是可选的,因此我们不在此处指定。然后我们使用numpy的广播将axis
分配给所有这些索引。
然后生成:
replace_val