如何用给定索引范围/切片的零填充numpy数组



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

给定一个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. 如何用给定索引/坐标的1填充零的numpy数组
  • 如果范围被转换为精确坐标
  1. 将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.]]

相关内容

  • 没有找到相关文章

最新更新