脾气暴躁-如何在发生变化的索引处移动值

时间:2018-11-20 15:24:03

标签: python numpy

所以我想将我的值移动到发生变化的一维numpy数组中。应该配置移位样本。

input = np.array([0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0])
shiftSize = 2
out = np.magic(input, shiftSize)
print out
np.array([0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0])

例如发生了第一个开关,索引为4,因此索引2,3变为'1'。 下一个发生在5,所以6和7变成“ 1”。

编辑:同样重要的是没有循环,因为这可能很慢(大型数据集需要此循环) EDIT2:索引和变量名

我尝试使用np.diff,所以我先知道更改发生的位置,然后再输入np.put,但是对于多个索引范围,这似乎是不可能的。

谢谢您的帮助!

3 个答案:

答案 0 :(得分:3)

您想要的内容称为“ binary dilation”,包含在scipy.ndimage中:

import numpy as np
import scipy.ndimage

input = np.array([0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0], dtype=bool)
out = scipy.ndimage.morphology.binary_dilation(input, iterations=2).astype(int)
# array([0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0])

答案 1 :(得分:0)

尼尔斯的答案似乎很好。这是仅使用NumPy的替代方法:

import numpy as np

def dilate(ar, amount):
    # Convolve with a kernel as big as the dilation scope
    dil = np.convolve(np.abs(ar), np.ones(2 * amount + 1), mode='same')
    # Crop in case the convolution kernel was bigger than array
    dil = dil[-len(ar):]
    # Take non-zero and convert to input type
    return (dil != 0).astype(ar.dtype)

# Test
inp = np.array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0])
print(inp)
print(dilate(inp, 2))

输出:

[0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0]
[0 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 0]

答案 2 :(得分:0)

另一个numpy解决方案:

def dilatation(seed,shift):
out=seed.copy()
for sh in range(1,shift+1):
    out[sh:] |= seed[:-sh]
for sh in range(-shift,0):
    out[:sh] |= seed[-sh:]
return out

示例(shift = 2):

in : [0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0]
out: [0 0 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1]