这个问题与下面提到的另外两个问题密切相关。虽然它们可以被调整,但我不确定它们是否提供了针对这种特定情况的最佳解决方案。
给定一个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.]])
如何用给定的索引范围/切片填充零的numpy数组?
相关问题:
- 如何用给定索引/坐标的1填充零的numpy数组
- 如果范围被转换为精确坐标
- 将numpy数组与另一个数组进行切片
- 可适用于1维以上的解。例如,如果reduceat可以用于多个切片数组
使用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.]]