我尝试将numpy数组切片和高级索引结合起来,但未成功。例如,我有一个numpy数组填充1/0'
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
给出了结果:
array([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。
我的目标是避免为了效率原因而对数组进行for循环迭代。我对python和numpy比较新,所以欢迎所有的建议。
答案 0 :(得分:0)
如何创建切片矩阵:
>>> 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])
请注意,此代码假定您在末尾有足够的“填充”。如果它尝试索引IndexError
之外的项目,则会失败r
。
答案 1 :(得分:0)
问题描述类似于典型的信号卷积步骤。 scipy中有两个实现信号处理的模块scipy.signal
和scipy.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
的完整序列,它们应该被剥离。之后,卷积数组中的非零元素将为您提供所需的布尔掩码:
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)