python - 索引 numpy 数组,其中每个列都有两个数组的开始和结束

标签 python numpy indexing

我有一个维度为 NxM 的 2D numpy 数组 A 我有两个数组,开头和结尾的尺寸为 Nx1

对于 A[k,:] 给出的每一行 k,我想将从 start[k] 到 end[k] 的列设置为 0:

A[:,start:end]=0

但是,我收到错误

TypeError: only integer scalar arrays can be converted to a scalar index

如果我只是索引

A[:,start]=0

它有效。但这不是我想要达到的目标。

每个k的start[k]:end[k]的长度不同

最佳答案

利用开始和结束索引数组的长度 - startsends 的长度,我们可以创建这些位置的掩码 -

r = np.arange(A.shape[1])
mask = (r >= np.asarray(starts)[:,None]) & (r < np.asarray(ends)[:,None])
A[mask] = 0

示例运行 -

In [47]: np.random.seed(0)

In [48]: A = np.random.randint(10,100,(4,10))

In [49]: A
Out[49]: 
array([[54, 57, 74, 77, 77, 19, 93, 31, 46, 97],
       [80, 98, 98, 22, 68, 75, 49, 97, 56, 98],
       [91, 47, 35, 87, 82, 19, 30, 90, 79, 89],
       [57, 74, 92, 98, 59, 39, 29, 29, 24, 49]])

In [50]: starts = np.array([2,4,1,0,])

In [51]: ends = np.array([4,7,5,2])

In [52]: r = np.arange(A.shape[1])
    ...: mask = (r >= np.asarray(starts)[:,None]) & (r < np.asarray(ends)[:,None])
    ...: A[mask] = 0

In [53]: A
Out[53]: 
array([[54, 57,  0,  0, 77, 19, 93, 31, 46, 97],
       [80, 98, 98, 22,  0,  0,  0, 97, 56, 98],
       [91,  0,  0,  0,  0, 19, 30, 90, 79, 89],
       [ 0,  0, 92, 98, 59, 39, 29, 29, 24, 49]])

对于较小的开始、结束数组,或者如果 A 是一个非常大的数组,简单的循环可能会更好。

关于python - 索引 numpy 数组,其中每个列都有两个数组的开始和结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52524761/

相关文章:

r - 如何在R中根据网格索引坐标数据?

Java 索引数组帮助。编码棒

python - 为什么我的 while 循环输出越界值?

numpy - 如何更快地 np.roll() ?

python - 根据另一个引用数组从一个数组中选择接近的匹配项

python - 从元组列表中为每个项目创建 np.arrays 的最快方法

r - 如何将 S4 对象的 setMethod `[` 应用于插槽中的 data.table

python - 在引用字段列表上使用 only() 进行 Mongoengine 查询

python - 即使文件夹存在,os.path.isdir() 也会返回 False

python - SWIG 和 Python : Create a package compatible with any 3. x 版本