【发布时间】:2016-12-19 19:26:39
【问题描述】:
我有一个 numpy 数组、一个定义数组内范围的开始/结束索引列表和一个值列表,其中值的数量与范围的数量相同。目前在循环中执行此分配非常慢,因此我想以矢量化的方式将值分配给数组中的相应范围。这可以吗?
这是一个具体的简化示例:
a = np.zeros([10])
这是定义a 内范围的开始索引列表和结束索引列表,如下所示:
starts = [0, 2, 4, 6]
ends = [2, 4, 6, 8]
这是我想分配给每个范围的值列表:
values = [1, 2, 3, 4]
我有两个问题。首先是我不知道如何同时使用多个切片对数组进行索引,因为范围列表是在实际代码中动态构建的。一旦我能够提取范围,我不确定如何一次分配多个值 - 每个范围一个值。
以下是我尝试创建切片列表的方法以及在使用该列表索引数组时遇到的问题:
slices = [slice(start, end) for start, end in zip(starts, ends)]
In [97]: a[slices]
...
IndexError: too many indices for array
In [98]: a[np.r_[slices]]
...
IndexError: arrays used as indices must be of integer (or boolean) type
如果我使用静态列表,我可以一次提取多个切片,但是分配不能按我想要的方式工作:
In [106]: a[np.r_[0:2, 2:4, 4:6, 6:8]] = [1, 2, 3]
/usr/local/bin/ipython:1: DeprecationWarning: assignment will raise an error in the future, most likely because your index result shape does not match the value array shape. You can use `arr.flat[index] = values` to keep the old behaviour.
#!/usr/local/opt/python/bin/python2.7
In [107]: a
Out[107]: array([ 1., 2., 3., 1., 2., 3., 1., 2., 0., 0.])
我真正想要的是这个:
np.array([1., 1., 2., 2., 3., 3., 4., 4., 0., 0.])
【问题讨论】:
-
是否保证每个切片都从前一个切片结束的地方开始?
-
不,切片之间可能存在间隙。唯一的保证是它们不会重叠。
标签: python numpy vectorization