python - 如何根据包含初始和最终索引的 2 个 1D 数组对 2D numpy 数组进行切片
问题描述
我有一个 2D numpy 数组,假设它的形状为 4x10(4 行和 10 列)。我有 2 个具有初始和最终索引的 1D 数组,所以它们都是 20x1。例如,假设
initial = [1, 2, 4, 5]
final = [3, 6, 8, 6]
那么我想得到
data[0,1:3]
data[1,2:6]
data[2,4:8]
data[3,5:6]
当然,这些数组中的每一个都有不同的大小,所以我想将它们存储在一个列表中。如果我用for
循环来做,它看起来像这样:
arrays = []
for i in range(4):
slice = data[i,initial[i]:final[i]]
arrays.append(slice)
有没有更有效的方法来做到这一点?我宁愿避免使用for
循环,因为我的实际数据很大。
解决方案
您可以使用numpy.split
扁平化data
(使用numpy.ndarray.flatten
)并修改切片:
sections = np.column_stack([initial, final]).flatten()
sections[::2] += np.arange(len(initial)) * data.shape[1]
sections[1::2] += sections[::2] - np.array(initial)
np.split(data.flatten(), sections)[1::2]
推荐阅读
- python - 使用 Numpy 在数组中找到彼此之间足够距离的最大点的有效方法
- android - 使用 API 级别 15,我的 pendingIntent 不会在 taskStack 中发送额外的顶级意图
- c++ - 在哈希表中查找项目的位置
- django - Django Ckeditor 和 Youtube 插件不起作用
- java - ubuntu 服务器 16.04 - tomcat7 无法启动
- c# - 命名管道保持活动服务器
- drupal-8 - Drupal 8 Groups 模块查看登录成员所属的组内的节点
- javascript - 使用 react-slick 将所有 gatsby-image 图像渲染为一张幻灯片
- spring-boot - Spring Boot 2.3 构建映像失败
- c++ - 在 gcc/clang (C++) 中获取函数范围之外的标签地址