Je veux créer un tableau en python avec un espacement fixe entre les valeurs 2n et 2n + 1, et un autre espacement différent entre les valeurs 2n + 1 et 2n + 2.

Je veux créer un tableau comme le suivant, en spécifiant juste le point initial, le point final et les deux espacements différents que je veux utiliser:

x = [0 0.25 0.75 1 1.5 1.75]

Dans ce cas, ces valeurs seraient 0 et 2 et (0,25,0,5) pour l'espacement.

Est-il possible de le faire en utilisant une fonction prédéfinie?
Je n'ai pas trouvé cette fonctionnalité dans le paquet numpy.

2
A. A. 22 juil. 2015 à 16:54

3 réponses

Meilleure réponse

Essaye ça:

np.cumsum(np.tile([0.25, 0.5], 9))

Si vous souhaitez ajouter un zéro, enveloppez-le dans np.insert(x, 0, 0).

4
Lynn 22 juil. 2015 à 14:07

Décider de la longueur du tableau de sortie pour un cas générique pourrait être délicat, comme cela a également été discuté dans la solution de @ YXD. En supposant que vous vouliez terminer au point auquel le deuxième espacement a été ajouté, vous pouvez initialiser un tableau de zéros, mettre la valeur de départ comme premier élément, puis mettre alternativement le premier et le deuxième espacement et enfin faire une sommation cumulée pour obtenir la sortie souhaitée. Voici une implémentation pour réaliser quelque chose sur ces lignes -

# Random inputs
start_pt = 0.25
final_pt = 2.85

spacing1 = 0.15
spacing2 = 0.50

# Estimate length of output array
N = 1+2*int(np.ceil((final_pt - start_pt)/(spacing1+spacing2)))

# Setup values array that holds the starting point as the first element
#  and then spacing1 and spacing2 alternately
vals = np.zeros(N)
vals[0] = start_pt
vals[1::2] = spacing1
vals[2::2] = spacing2

# Finally, do cumsum to get the desired output
out = vals.cumsum()

Sortie avec les entrées listées -

In [134]: out
Out[134]: array([ 0.25,  0.4 ,  0.9 ,  1.05,  1.55,  1.7 ,  2.2 ,  2.35,  2.85])
2
Divakar 22 juil. 2015 à 14:22

Je pense qu'un problème consiste à déterminer le nombre d'éléments, qui peuvent être ambigus selon ce que vous voulez faire aux points d'extrémité. Ceci est un exemple de la façon dont vous pourriez le gérer, mais je devrai y jeter un coup d'œil plus tard pour voir si cela a du sens. J'ai pris le combo cumsum et tile de la réponse de @Mauris.

import numpy as np

def spaced_array(start, end, spacings):
    step = sum(spacings)

    # how many steps in total can we take? (upper bound)
    repeats = int(np.ceil((end - start) / step))
    n = repeats * len(spacings)

    arr = np.full(n, start)
    arr[1:] += np.cumsum(np.tile(spacings, repeats))[:n-1]

    return arr

spacings = [0.25, 0.5]
print(spaced_array(0, 2, spacings))
print(spaced_array(0, 5, spacings))
2
YXD 22 juil. 2015 à 14:17