2016-01-22 2 views
8

J'applique fft dans le cadre de mes devoirs. Mon problème réside dans la mise en œuvre de la réorganisation des éléments de données en utilisant l'inversion de bits. Je reçois l'avertissement suivant:seuls les entiers, les tranches (`:`), les ellipses (`...`), numpy.newaxis (`None`) et les tableaux entiers ou booléens sont des indices valides

DeprecationWarning: using a non-integer number instead of an integer will result in an error in the future.

data[x], data[y] = data[y], data[x]

Et le système de classement automatique (fourni par l'université) renvoie les éléments suivants:

error: only integers, slices (:), ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices.

Mon code est:

def shuffle_bit_reversed_order(data: np.ndarray) -> np.ndarray: 
    """ 
    Shuffle elements of data using bit reversal of list index. 

    Arguments: 
    data: data to be transformed (shape=(n,), dtype='float64') 

    Return: 
    data: shuffled data array 
    """ 

    # implement shuffling by reversing index bits 

    size = data.size 

    half = size/2; 

    for x in range(size): 
     xx = np.int(x) 
     n = np.int(half) 

     y = 0 

     while n > 0: 
      y += n * np.mod(xx,2) 
      n /= 2 
      xx = np.int(xx /2) 

     if (y > x): 

      data[x], data[y] = data[y], data[x] 

    return data 

J'ai déjà mis en œuvre la Fonctionne pour fft mais cela ne fonctionnera pas tant que je n'aurai pas cette fonction de brassage. Je pense que le problème est que mes données sont de type 'float64' et je l'ai peut-être utilisé comme un nombre entier mais je ne sais pas comment je peux le résoudre.

+1

Quelle est la valeur de 'y' lorsque vous obtenez cette erreur? – Barmar

Répondre

14

Je crois que votre problème est le suivant: dans votre boucle while, n est divisé par 2, mais ne sera jamais converti en nombre entier, il devient donc un flottant à un certain point. Il est ensuite ajouté sur y, qui est également un flotteur, et cela vous donne l'avertissement.

4

Vous pouvez utiliser // à la place de single /. Cela convertit directement int.