索引 numpy 数组,其中每个列有两个数组的开头和结尾



>我有一个维度为 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]:结束 [k] 的长度因每个 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是一个非常大的数组,简单地循环可能会更好。

不知道你在说什么。它非常适合我:

>>> import numpy as np
>>> a = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> a[:, 1:2] = 0
>>> a
array([[1, 0, 3],
[4, 0, 6],
[7, 0, 9]])

若要调试程序,请尝试在

A[:,start:end]=0

它可以帮助您找出问题所在。