python - 索引 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 的 start[k]:end[k] 的长度不同
解决方案
随着开始和结束索引数组的长度 -starts
以及ends
较大的长度,我们可以创建这些位置的掩码 -
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 - 在 python 函数中使用字符串时接受“接近匹配”?
- solr - 索引 Solr 时如何指定文件类型
- node.js - MongoDb + 猫鼬 | 如何散列密码数组而不是单个密码
- node.js - 为什么 vscode 控制台显示调试失败,即使它没有?
- css - 在测试中验证文本的 CSS 文本转换
- python - 如何从我的字典值中删除 '\n'
- python - 加载数据集时“没有足够的价值来解压” - Allennlp _read
- r - 将奇怪的格式字符日期转换为 R 中的日期
- angular - 如何让用户将他们的自定义域指向客户端 Angular 应用程序中的特定路由?
- python - 如果值在列表中,则 Pandas 数据框中的重复行