在Numpy中从多个切片中选择

时间:2018-02-25 17:46:44

标签: python numpy

说我们有

a = np.ones((3,3,3))

slices = [(0, 1, slice(None)), (0, slice(None), 0),  (slice(None), 1, 0)]

是否有一种简单的方法可以从a中选择/更改slices的值?

例如,我想在{1}}下将0分配给a,以便a成为

array([[[0., 1., 1.],
        [0., 0., 0.],
        [0., 1., 1.]],

       [[1., 1., 1.],
        [0., 1., 1.],
        [1., 1., 1.]],

       [[1., 1., 1.],
        [0., 1., 1.],
        [1., 1., 1.]]])

迭代方法是

for t in slices:
    a[t] = 0

是否有更好的方法可以使用像np.r_这样的索引,就像JoshAdel在Assign value to multiple slices in numpy中使用的那样?

我希望能够实现a[SLICES] = 0之类的功能,并将a中每个切片的slices的所有部分更改为0

1 个答案:

答案 0 :(得分:2)

你知道r_的作用吗?它将切片转换为范围,然后将整个混乱连接起来。

我不知道您是否可以使用r_或类似的东西来构建所需的索引。但是:

In [168]: idx = np.where(a==0)
In [169]: idx
Out[169]: 
(array([0, 0, 0, 0, 0, 1, 2]),
 array([0, 1, 1, 1, 2, 1, 1]),
 array([0, 0, 1, 2, 0, 0, 0]))

这让我们了解了所需的索引数组(减去一些可能重复的数据)。

可以将这3个ogrid列表连接成一个组合:

In [181]: np.ogrid[0:1,1:2,:3]
Out[181]: [array([[[0]]]), array([[[1]]]), array([[[0, 1, 2]]])]

In [182]: np.ogrid[0:1,:3,0:1]
Out[182]: 
[array([[[0]]]), array([[[0],
         [1],
         [2]]]), array([[[0]]])]

In [183]: np.ogrid[:3,1:2,0:1]
Out[183]: 
[array([[[0]],

        [[1]],

        [[2]]]), array([[[1]]]), array([[[0]]])]

单独选择a中的0。

最简单的方法是将它们转换为相应的等效数据,然后加入生成的1d数组。

In [188]: np.ravel_multi_index(Out[181],(3,3,3))
Out[188]: array([[[3, 4, 5]]])
etc
In [195]: np.hstack([Out[188].ravel(), Out[189].ravel(), Out[190].ravel()])
Out[195]: array([ 3,  4,  5,  0,  3,  6,  3, 12, 21])
In [197]: a.flat[_]
Out[197]: array([0., 0., 0., 0., 0., 0., 0., 0., 0.])

In [199]: np.unravel_index(Out[195],(3,3,3))
Out[199]: 
(array([0, 0, 0, 0, 0, 0, 0, 1, 2]),
 array([1, 1, 1, 0, 1, 2, 1, 1, 1]),
 array([0, 1, 2, 0, 0, 0, 0, 0, 0]))

Out[169]Out[199]具有相同的值,但重复项除外。

这是连接几个1d切片的问题的概括。索引和连接所需的时间与首先连接索引的时间相同。