如何用给定索引 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 数组?
相关问题:
- 如果将范围转换为精确坐标,则可以进行调整
- Slicing numpy array with another array
- 如果解决方案被推广到超过 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.]]
这个问题与下面提到的另外两个问题密切相关。虽然它们可以进行调整,但我不确定它们是否提供了针对这种特定情况的最佳解决方案。
给定一个由零组成的 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 数组?
相关问题:
- 如果将范围转换为精确坐标,则可以进行调整
- Slicing numpy array with another array
- 如果解决方案被推广到超过 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.]]