python - 在多维 numpy 数组的每个索引处切片不同的范围
问题描述
我有一个m
x n
numpy array arr
,对于 的每一列arr
,我有一个给定的行范围,我想访问它们。
我有一个n
x1
数组vec
来描述这个范围何时开始。
该范围有一些恒定的持续时间d
。
如何有效地提取这个感兴趣的d
xn
数组?
这可以通过巧妙的切片来完成吗?
我最初的想法是尝试类似:
arr = np.tile(np.arange(10),(4,1)).T
vec = np.array([3,4,5,4])
d = 3
vec_2 = vec+d
out = arr[vec:vec2,np.arange(n)]
但这会产生以下错误:
TypeError:只有整数标量数组可以转换为标量索引
所需的输出将是以下数组:
array([[3, 4, 5, 4],
[4, 5, 6, 5],
[5, 6, 7, 6],
[6, 7, 8, 7])
我可以循环d
,但性能对于这段代码很重要,所以我更愿意对其进行矢量化。
解决方案
In [489]: arr=np.arange(24).reshape(6,4)
In [490]: vec=np.array([0,2,1,3])
利用最近的扩展linspace
来生成几个数组:
In [493]: x = np.linspace(vec,vec+2,3).astype(int)
In [494]: x
Out[494]:
array([[0, 2, 1, 3],
[1, 3, 2, 4],
[2, 4, 3, 5]])
In [495]: arr[x, np.arange(4)]
Out[495]:
array([[ 0, 9, 6, 15],
[ 4, 13, 10, 19],
[ 8, 17, 14, 23]])
列迭代方法:
In [498]: np.stack([arr[i:j,k] for k,(i,j) in enumerate(zip(vec,vec+3))],1)
Out[498]:
array([[ 0, 9, 6, 15],
[ 4, 13, 10, 19],
[ 8, 17, 14, 23]])
推荐阅读
- javascript - 如何避免突变道具并在其他组件中进行相同的修改?
- java - 将列表字符串列表转换为整数列表
- javascript - 如何将参数从 SearchBox 传递到 React 中的 fetch url
- javascript - Javascript 列大小调整仅在页面刷新时起作用
- bash - 如何使用 Airflow 将 bash 命令的结果加载到 gcs 中?
- php - php pdo json 编码数组
- r - 将函数应用于数据框列表会删除数据
- python - 使用 pip 在 windows 上安装以前版本的 tensorlfow
- r - R没有绘制所有线/点
- react-native - React-Native 水平 FlatList