Je voudrais donc déplacer mes valeurs dans un tableau numpy 1D, où le changement s'est produit. L'échantillon de décalage doit être configuré.

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])

Par exemple, le premier changement s'est produit et l'index 4, donc l'index 2,3 devient «1». Le suivant est arrivé à 5, donc 6 et 7 devient «1».

EDIT: Il serait également important de se passer de cycle car, cela pourrait être lent (il est nécessaire pour les grands ensembles de données) EDIT2: index et nom de variable

J'ai essayé avec np.diff, donc j'arrive là où les changements se sont produits, puis np.put, mais avec plusieurs plages d'index, cela semble impossible.

Merci pour l'aide à l'avance!

1
Bengya 20 nov. 2018 à 18:24

3 réponses

Meilleure réponse

La réponse de Nils semble bonne. Voici une alternative utilisant NumPy uniquement:

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))

Production:

[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]
0
jdehesa 20 nov. 2018 à 17:18

Ce que vous voulez s'appelle "dilatation binaire "et est contenu dans 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])
3
Nils Werner 20 nov. 2018 à 15:52

Une autre solution 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

Exemple (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]
0
B. M. 20 nov. 2018 à 18:05