【问题标题】:Replace values in an nd numpy array at given axis index在给定轴索引处替换 nd numpy 数组中的值
【发布时间】:2017-10-16 01:23:59
【问题描述】:

我想用给定值(例如0)沿给定轴(例如-2)在给定索引(例如0)处替换给定numpy数组(A)中的值, 相当于:

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 方法可以实现这一目标?

谢谢。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    您可以使用 省略号(请参阅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]]]])
    

    【讨论】:

    • 读者注意:省略号仅适用于 python3.x。对于 2.x,您需要构建一个 slice 对象。
    • 酷,这就是我要找的!而且跟python3或者2没有关系,都是numpy的东西。
    • @cᴏʟᴅsᴘᴇᴇᴅ 您使用的是哪个 python 2.x?它似乎在 python 2.7.13 和 numpy 1.12.0 上对我有用。
    • Ellipsis 对象也存在于 2.x 上,但 ... 语法无效,至少在我使用的版本 (2.7.10) 上是无效的。
    • 使用python=2.7.10numpy=1.12.0 在conda 环境中测试和工作,也使用python=2.6.9numpy=1.9.2python=2.6.9 中工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2016-06-02
    • 1970-01-01
    • 2012-09-06
    • 2015-10-31
    • 1970-01-01
    • 2012-11-14
    相关资源
    最近更新 更多