在给定的轴索引处替换nd numpy数组中的值。

3

我希望能够替换给定numpy数组(A)中给定索引(例如0)沿着给定轴(例如-2)的值为给定值(例如0),同样地:

A[:,:,0,:]=0

问题在于输入数组A可能是3D或4D或其他形状,因此对于3D数据,我需要:

A[:,0,:]=0

如果是5D: A[:,:,:,0,:]=0 目前我正在使用exec()来完成此操作:
slicestr=[':']*numpy.ndim(var)
slicestr[-2]=str(0)
slicestr=','.join(slicestr)
cmd='A[%s]=0' %slicestr
exec(cmd)
return A

我有些担心使用exec()可能不是一种很好的方法。我知道numpy.take()可以按特定索引在特定轴上给我列,但是要替换值,我仍然需要构建动态的切片/索引字符串。所以我想知道是否有任何本地的numpy方法可以实现这一点?

谢谢。

1个回答

7
你可以使用省略号(详见numpy索引),以跳过前几个维度:
# assert A.ndim >= 2
A[...,0,:]=0

A2d = np.arange(12).reshape(2,6)
A3d = np.arange(12).reshape(2,3,2)
A4d = np.arange(12).reshape(2,1,3,2)

A2d[...,0,:] = 0

A2d
#array([[ 0,  0,  0,  0,  0,  0],
#       [ 6,  7,  8,  9, 10, 11]])

A3d[...,0,:] = 0

A3d
#array([[[ 0,  0],
#        [ 2,  3],
#        [ 4,  5]],

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

A4d[...,0,:] = 0

A4d
#array([[[[ 0,  0],
#         [ 2,  3],
#         [ 4,  5]]],  

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

读者注意:省略号只适用于Python3.x。对于2.x版本,您需要构建一个“slice”对象。 - cs95
1
太棒了,这就是我要找的!而且与python3或2无关,这是一个numpy的东西。 - Jason
@cᴏʟᴅsᴘᴇᴇᴅ 你使用的是哪个 Python 2.x 版本?在 Python 2.7.13 和 numpy 1.12.0 上测试可以正常工作。 - Psidom
1
Ellipsis 对象在 2.x 版本中也存在,但是 ... 语法无效,至少在我使用的版本(2.7.10)上是这样。 - cs95
1
已在 python=2.7.10numpy=1.12.0 的 conda 环境中测试并工作,也在 python=2.6.9numpy=1.9.2 中工作。 - Jason
@Jason 必须是 conda 环境;-) 在我的标准 Mac 发行版上,... 就是不起作用 :-( - cs95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接