【问题标题】:on a numpy 2D array - how to set last N array elements in each row to zero when N changes over rows在一个 numpy 2D 数组上 - 当 N 行更改时如何将每行中的最后 N 个数组元素设置为零
【发布时间】:2019-10-02 13:45:32
【问题描述】:

说,我有一个由 20 个元素组成的 2D numpy 数组,例如:

arr = np.array([[1, 2, 15, 7],[9, 11, 17, 19],[5, 7, 5, 8],[19, 4, 1, 45],[10, 7, 14, 8]])

还有一个额外的数组:

to_zero = np.array([0, 2, 1, 3, 2])

现在,对于每一行i,我想让最后一个to_zero[i]元素等于0,所以最终我们会得到以下结果:

res = np.array([[1, 2, 15, 7],[9, 11, 0, 0],[5, 7, 5, 0],[19, 0, 0, 0],[10, 7, 0, 0]])

我想在一个非常大的数组上执行此操作。 有什么方法可以将这个操作向量化,没有循环,也没有辅助数组?

【问题讨论】:

标签: python numpy vectorization


【解决方案1】:

使用broadcasted-comparison 获取那些尾随的掩码,然后掩码输入 -

In [63]: r = np.arange(arr.shape[1])[::-1]

In [66]: mask = to_zero[:,None]>r

In [69]: mask # mask of trailing places to be reset in input
Out[69]: 
array([[False, False, False, False],
       [False, False,  True,  True],
       [False, False, False,  True],
       [False,  True,  True,  True],
       [False, False,  True,  True]])

In [67]: arr[mask] = 0

In [68]: arr
Out[68]: 
array([[ 1,  2, 15,  7],
       [ 9, 11,  0,  0],
       [ 5,  7,  5,  0],
       [19,  0,  0,  0],
       [10,  7,  0,  0]])

获取r 的替代方法是使用np.arange(arr.shape[1]-1,-1,-1)

通过元素乘法获得最终输出的替代方法:arr*~mask

或者用 flipped-comparison 构造 flipped-mask 然后相乘 -

In [75]: arr*(to_zero[:,None]<=np.arange(arr.shape[1]-1,-1,-1))
Out[75]: 
array([[ 1,  2, 15,  7],
       [ 9, 11,  0,  0],
       [ 5,  7,  5,  0],
       [19,  0,  0,  0],
       [10,  7,  0,  0]])

对于大型阵列,利用 numexpr 的多核 -

In [78]: import numexpr as ne

In [79]: ne.evaluate('arr*mask',{'mask':to_zero[:,None]<=np.arange(arr.shape[1]-1,-1,-1)})
Out[79]: 
array([[ 1,  2, 15,  7],
       [ 9, 11,  0,  0],
       [ 5,  7,  5,  0],
       [19,  0,  0,  0],
       [10,  7,  0,  0]])

【讨论】:

  • 有什么方法可以向量化这个操作,没有问题中提到的辅助数组
  • @aviyaChe 基本上你要求一个内置的,遗憾的是在 NumPy 中没有。此外,我们正在构建一个掩码/布尔数组,它在 unix 系统上占 int 数组的 1/8。
  • 即使给定行的选择是一个切片,整个数组的选择也需要某种形式的高级索引,以识别每个元素。这就是面具的作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 2019-12-16
  • 2022-09-23
  • 1970-01-01
  • 2013-04-04
  • 2017-05-21
  • 2016-07-20
相关资源
最近更新 更多