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

时间:2017-10-16 01:23:59

标签: python arrays numpy

我希望使用给定值沿给定轴(例如A)替换给定索引处的给定numpy数组(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()可以在特定轴上给出特定索引处的列,但是为了替换值,我仍然需要构造切片/索引字符串,这是动态的。所以我想知道是否有任何原生的方式来实现这一目标?

感谢。

1 个答案:

答案 0 :(得分:4)

您可以使用省略号(有关详情,请参阅numpy indexing)以跳过前几个维度:

# 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]]]])