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
函数的对象可以处理切片。它具有开始
、步骤
和停止
属性。