python - 从 Numpy 中的多个切片中选择

标签 python numpy

假设我们有

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

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

有没有一种简单的方法可以从切片中选择/更改a的值?

例如,我想将 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

是否有更好的方法来使用像 JoshAdel 在 Assign value to multiple slices in numpy 中使用的索引,例如 np.r_

我希望实现类似 a[SLICES] = 0 的效果,并将 a 的所有部分从 slices 中的每个切片更改为 0

最佳答案

你知道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。

将它们转换为它们的等价物,然后连接生成的一维数组可能是最简单的。

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] 具有相同的值,但重复项除外。

这是连接多个一维切片问题的概括。建立索引然后连接所需的时间与先连接索引所需的时间大致相同。

关于python - 从 Numpy 中的多个切片中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48976523/

相关文章:

python - 无故改变列表值的函数

python - 如何刷新按钮图标,表明它在繁重的工作开始之前正在工作

python - Django : fixtures object not retrievable

python - 如何从元组列表中删除项目?

python-3.x - 如何使用接受一个输入并输出标量值的函数来初始化等高线图的数据?

python-3.x - TypeError : ufunc 'isfinite' not supported for the input types, 并且输入无法安全地强制转换为任何支持的类型

python - 从 python 使用 RotatingFileHandler 时无法获取备份日志文件

python - 在 OpenERP7 中保持自定义模块同步

python - 具有来自另一个数组的索引的 Numpy 索引嵌套数组

python - 等价于 NumPy 中的命名元组?