如何用给定索引 ranges/slices 的值填充 numpy 的零数组

How to fill numpy array of zeros with ones given index ranges/slices

这个问题与下面提到的另外两个问题密切相关。虽然它们可以进行调整,但我不确定它们是否提供了针对这种特定情况的最佳解决方案。

给定一个由零组成的 numpy 数组

arr = np.zeros([2, 5])

array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

根据另一个范围数组(或元组列表)用零填充

ranges_ones = np.array([[0,3], [1,4]])

结果

array([[1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1.]])

如何用给定索引 ranges/slices 的零填充 numpy 数组?

相关问题:

  1. Slicing numpy array with another array

使用 numpy 广播,您可以创建一个布尔数组,对于您希望为 1 的单元格,该数组为 True,否则为 False。由于 ranges_ones 的第一列是起始索引,第二列是结束索引,我们可以使用 &

创建一个区间
idx = np.arange(arr.shape[1])
s = (idx >= ranges_ones[:, [0]]) 
e = (idx <= ranges_ones[:, [1]])
arr[s & e] = 1

输出:

>>> arr
array([[1., 1., 1., 1., 0.],
       [0., 1., 1., 1., 1.]])

您可以根据范围数组创建切片对象。结果与您预期的答案不同,因为在切片时不包括范围的停止值,但很容易调整它,因此结果就是您要查找的结果。

import numpy as np

arr = np.zeros([2, 5])

ranges_ones = np.array([[0,3], [1,4]])

for i, range in enumerate(ranges_ones):
    arr[i, slice(range[0], range[1])] = 1
    # arr[i, range[0]:range[1]] = 1 also works btw

print(arr) # [[1. 1. 1. 0. 0.] [0. 1. 1. 1. 0.]]

一个简单的 enumerate() 调用应该可以解决问题:

import numpy as np

arr = np.zeros([2, 5])
ranges_ones = np.array([[0, 4], [1, 4]])

for i, (a, b) in enumerate(ranges_ones):
    arr[i, a: b] = 1
    
print(arr)

输出:

[[1. 1. 1. 1. 0.]
 [0. 1. 1. 1. 0.]]