Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python Numpy中结合切片和高级索引_Python_Numpy_Slice - Fatal编程技术网

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

在python Numpy中结合切片和高级索引,python,numpy,slice,Python,Numpy,Slice,我尝试将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 结果如下:

我尝试将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,255,0,0, 0,0,0,0,0,0,0,0,0]

不过,我预计会出现以下情况:

数组[0,0,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,0,0,0,0,0,0]

考虑到我的索引[nz,:nz:nz+5]=255。我认为这意味着从当前指数nz到nz+5,将值设置为255


我的目标是避免由于效率原因而必须对数组进行for循环迭代。我对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之外的项目,则索引器将失败。

问题描述类似于典型的信号卷积步骤。scipy中有两个模块实现信号处理,scipy.signal和scipy.ndimage,如果您计划做更多的工作,您可能会发现这两个模块很有趣。在这种特殊情况下,您可以使用泛型np.convalve注意,我添加了尾随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序列,它们应该被剥离。之后,卷积数组中的非零元素将为您提供所需的布尔掩码:

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)

你能用一个输入样本和期望的输出编辑你的问题吗?这是一个索引错误,只是在一些旧的numpy版本中是一个错误,它是完全允许的。一个维度有两个索引。