Python 在特定维度中更改numpy数组上的指定值

Python 在特定维度中更改numpy数组上的指定值,python,arrays,numpy,Python,Arrays,Numpy,想知道是否有一种简单的方法可以做到这一点: 假设我有一个形状为(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

想知道是否有一种简单的方法可以做到这一点:

假设我有一个形状为
(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\u replace(array=x,axis=1,pos=0,replace\u val=0)

这将产生与上面相同的数组


我可以想到一种方法,将矩阵展平,并根据每个数组的维数计算每个变量的位置,但我想知道numpy中是否已经内置了一些东西。

您可以构造一个切片元组,然后使用特定的轴作为位置。因此,您可以将此类函数定义为:

def array_replace(array, axis, pos, replace_val):
    array[(slice(None),) * axis + (pos,)] = replace_val
所以我们要做的是用
切片
对象
(切片(无))
构造一个1元组。切片对象是Python在冒号幕后生成的对象
。因此,
x[:,0,:]
x[(片(无),0,片(无))的简单表示形式

接下来,我们重复这个切片
次(指定轴之前的次数),然后是我们想要的位置。其余的切片是可选的,因此我们在这里不指定这些切片。然后,我们使用numpy的广播将
replace\u val
分配给所有这些索引

然后生成:

>>> x
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5]],

       [[ 6,  7],
        [ 8,  9],
        [10, 11]]])
>>> array_replace(array=x, axis=1, pos=0, replace_val=0)
>>> x
array([[[ 0,  0],
        [ 2,  3],
        [ 4,  5]],

       [[ 0,  0],
        [ 8,  9],
        [10, 11]]])

我不知道你想要什么,但我可以保证这不是最好的方法。Numpy足够强大,这样的操作可以很容易地矢量化。谢谢!您知道
slice
函数在“幕后”执行的操作的参考吗?我以前没有见过这种用法,但它似乎非常有用。@lstbl:
slice
是构造函数。它构造一个
切片
对象。它没有什么作用,只是作为
的表示形式存在。例如,具有
\uuu getitem\uuu
函数的对象可以处理切片。它具有
开始
步骤
停止
属性。