【问题标题】:Fill in values between given indices of 2d numpy array在二维 numpy 数组的给定索引之间填充值
【发布时间】:2017-07-15 22:08:07
【问题描述】:

给定一个 numpy 数组,

a = np.zeros((10,10))

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

对于一组索引,例如:

start = [0,1,2,3,4,4,3,2,1,0]
end   = [9,8,7,6,5,5,6,7,8,9]

您如何“选择”开始和结束索引之间的所有值/范围并获得以下内容:

result = [[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
          [1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
          [1, 1, 1, 0, 0, 0, 0, 1, 1, 1],
          [1, 1, 1, 1, 0, 0, 1, 1, 1, 1],
          [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
          [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
          [1, 1, 1, 1, 0, 0, 1, 1, 1, 1],
          [1, 1, 1, 0, 0, 0, 0, 1, 1, 1],
          [1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
          [1, 0, 0, 0, 0, 0, 0, 0, 0, 1]]

我的目标是“选择”列的每个给定索引之间的所有值。

我知道使用apply_along_axis 可以解决问题,但是有更好或更优雅的解决方案吗?

欢迎任何意见!!

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    你可以使用broadcasting -

    r = np.arange(10)[:,None]
    out = ((start  <= r) & (r <= end)).astype(int)
    

    这将创建一个形状为(10,len(start) 的数组。因此,如果您需要实际填充一些已经初始化的数组filled_arr,请执行 -

    m,n = out.shape
    filled_arr[:m,:n] = out
    

    示例运行 -

    In [325]: start = [0,1,2,3,4,4,3,2,1,0]
         ...: end   = [9,8,7,6,5,5,6,7,8,9]
         ...: 
    
    In [326]: r = np.arange(10)[:,None]
    
    In [327]: ((start  <= r) & (r <= end)).astype(int)
    Out[327]: 
    array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
           [1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
           [1, 1, 1, 0, 0, 0, 0, 1, 1, 1],
           [1, 1, 1, 1, 0, 0, 1, 1, 1, 1],
           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [1, 1, 1, 1, 0, 0, 1, 1, 1, 1],
           [1, 1, 1, 0, 0, 0, 0, 1, 1, 1],
           [1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
           [1, 0, 0, 0, 0, 0, 0, 0, 0, 1]])
    

    如果您打算将其用作 1s 作为 True 的掩码,请跳过转换为 int。因此,(start &lt;= r) &amp; (r &lt;= end) 将是掩码。

    【讨论】:

    • 给定一个任意形状的 ndarray (10,10),您将如何使用它来选择所需的项目/元素?
    • @wwii 那么output ncols = len(start)output nrows 用户必须指定。但是对于“压缩”版本,它将是end.max()+1。我把它保留为np.arange(10)[:,None]10 是第一个。的行。但是,是的,在一般意义上,我们需要在切片沿每个轴结束时使用这些行数和列数进行初始化和分配。
    • @wwii 在“选择”这个词上,我认为 OP 的意思是“选择和分配”。但同样,OP 可能意味着使用 1s 作为选择掩码从其他数组中进行选择。这也是一种可能的解释方式。
    • @Divakar 是的,我打算用它作为面具
    • @snowflake 做(a*mask).sum(0)np.einsum('ij,ij-&gt;j',a,mask)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2011-07-07
    • 1970-01-01
    • 2020-07-30
    • 2017-12-16
    • 1970-01-01
    相关资源
    最近更新 更多