python - 索引具有多个范围的numpy数组
问题描述
a
想象一个必须由多个范围索引的数组idx
:
In [1]: a = np.array([7,9,1,2,3,5,6,8,1,0,])
idx = np.array([[0,3],[5,7],[8,9]])
a, idx
Out[1]: (array([7, 9, 1, 2, 3, 5, 6, 8, 1, 0]),
array([[0, 3],
[5, 7],
[8, 9]]))
当然,我可以编写一个简单的for
循环,从而产生所需的输出:
In [2]: np.hstack([a[i[0]:i[1]] for i in idx])
Out[2]: array([7, 9, 1, 5, 6, 1])
但我想要一种完全矢量化的方法。例如,我希望np.r_
能提供一个解决方案。但是下面的代码不会产生所需的输出:
In [3]: a[np.r_[idx]]
Out[3]: array([[7, 2],
[5, 8],
[1, 0]])
而写出idx
确实会产生所需的输出。但现实生活idx
太大了,写不出来:
In [4]: a[np.r_[0:3,5:7,8:9]]
Out[4]: array([7, 9, 1, 5, 6, 1])
解决方案
您可以尝试对slice
自身进行矢量化:
>>> slice_np = np.vectorize(slice)
>>> slice_idx = tuple(slice_np(idx[:, 0], idx[:, 1]))
>>> a[np.r_[slice_idx]]
array([7, 9, 1, 5, 6, 1])
推荐阅读
- ios - 如何快速将时间字符串转换为 12 小时时间?
- javascript - 如何在反应formik输入字段中为占位符换行?
- sql - 如何在 postgres 中有效地(使用索引)查找未引用的行?
- c++ - 使用 cmake 和 msvc 构建 C++ - `/permissive-` 标志被删除
- google-apps-script - Gate.io 谷歌应用脚本 "INVALID_SIGNATURE","message":"签名不匹配"
- mongodb - mongodb CSFLE -- 使用动态数据键
- r - 字符串替换重复
- node.js - 为什么 findOne() 在 mogooDB 中不返回任何值
- qt - qt 安装程序框架视觉可再发行
- mapstruct - 使用 List<> 的 List<> 在 mapstruct 上进行 @Mapping