繁体   English   中英

在python Numpy中结合切片和高级索引

[英]Combining slicing and advanced indexing in python Numpy

我正在尝试将numpy数组切片和高级索引结合在一起,但未成功。 例如我有一个用1/0填充的numpy数组

r = np.array([0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0])

我发现非零元素的索引:

(nz,) = np.nonzero(r)

然后,我想使用非零索引数组对数组r进行操作。 对于r中的每个索引,我想为r中的某个值的范围(以下5个)着色。 就像是 -

r[nz,:nz:nz+5] = 255

得到结果:

数组([0,0,255,255,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0])

但是,我期望以下几点:

array([0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0])

给定我的索引[nz,:nz:nz + 5] =255。我认为这是指从当前索引nz到nz + 5的值设置为255。

我的目标是避免出于效率原因而必须对数组进行循环迭代。 我对python和numpy比较陌生,因此欢迎所有建议。

如何创建切片矩阵:

>>> import numpy as np
>>> r = np.array([0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0])
>>> nz = np.nonzero(r)
>>> slices = np.vstack(np.arange(x, x + 5) for x in nz[0])
>>> slices
array([[ 2,  3,  4,  5,  6],
       [ 3,  4,  5,  6,  7],
       [ 5,  6,  7,  8,  9],
       [ 8,  9, 10, 11, 12],
       [10, 11, 12, 13, 14]], dtype=int64)
>>> r[slices]
array([[1, 1, 0, 1, 0],
       [1, 0, 1, 0, 0],
       [1, 0, 0, 1, 0],
       [1, 0, 1, 0, 0],
       [1, 0, 0, 0, 0]])
>>> r[slices] = 255
>>> r
array([  0,   0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
       255, 255,   0,   0,   0,   0,   0])

请注意,此代码假定结尾处有足够的“填充”。 如果尝试索引r之外的项目,它将失败并出现IndexError

问题描述类似于典型的信号卷积步骤。 scipy中有两个实现信号处理的模块scipy.signalscipy.ndimage ,如果您打算做更多的事情,可能会发现它们很有趣。 在这种特殊情况下,您可以使用通用np.convolve (注意,我出于说明目的添加了尾随1):

In [45]: r = np.array([0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1])

In [46]: r[np.convolve(r, np.ones(5, dtype=r.dtype))[:-4] > 0] = 255; r
Out[46]: 
array([  0,   0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
       255, 255,   0,   0,   0,   0, 255])

这是卷积运算的结果:

In [48]: np.convolve(r, np.ones(5, dtype=r.dtype))
Out[48]: 
array([0, 0, 1, 2, 2, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1])

如您所见,最后一个1在最后产生了一个完整的1 s序列,应该将其剥离。 之后,卷积数组中的非零元素将为您提供所需的布尔掩码:

In [49]: np.convolve(r, np.ones(5, dtype=r.dtype))[:-4] > 0
Out[49]: 
array([False, False,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True, False, False, False,
       False,  True], dtype=bool)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM