2017-10-17 4 views
0

J'essaye actuellement d'implémenter un type de données qui stocke des flottants dans un tableau de nombre. Cependant, essayer d'assigner un tableau avec des éléments de ce type de différentes longueurs semble évidemment casser le code. On affecterait une séquence à un élément de tableau, ce qui n'est pas possible.Comment le typage des tableaux numériques est-il en interaction avec l'objet?

On peut contourner ceci en utilisant l'objet type de données au lieu de float. Pourquoi donc? Comment pourrait-on résoudre ce problème en utilisant des flottants sans créer une séquence?

Exemple de code qui ne fonctionne pas.

from numpy import * 

foo= dtype(float32, []) 
x = array([[2., 3.], [3.]], dtype=foo) 

code exemple qui fonctionne:

from numpy import * 

foo= dtype(float32, []) 
x = array([[2., 3.], [3., 2.]], dtype=foo) 

code exemple qui fonctionne, je tente de répliquer pour float:

from numpy import * 

foo= dtype(object, []) 
x = array([[2., 3.], [3.]], dtype=foo) 
+1

Pouvez-vous clarifier ce que vous essayez de réaliser? Quel problème essayez-vous de résoudre? –

+0

Je suis assez sûr que l'OP espère faire un élément du tableau soit une séquence de flottants - une liste ou un tuple probablement –

Répondre

0

Le object DTYPE dans Numpy crée simplement un tableau de pointeurs vers des objets Python. Cela signifie que vous perdez l'avantage de performance que vous obtenez habituellement de Numpy, mais il est toujours utile de le faire. Votre dernier exemple crée un tableau Numpy unidimensionnel de longueur deux, donc deux pointeurs vers des objets Python. Ces deux objets sont des listes, et la liste Python a une longueur dynamique arbitraire.

0

Je ne sais pas ce que vous essayez d'atteindre avec cela, mais note que

>>> np.dtype(np.float32, []) == np.float32 
True 

Les tableaux exigent le même nombre d'éléments pour chaque ligne. Donc, si vous alimentez une liste de listes en numpy et que toutes les sous-listes ont le même nombre d'éléments, elles seront heureusement converties en tableau. C'est pourquoi votre deuxième exemple fonctionne. Si les sous-listes n'ont pas la même longueur, chaque sous-liste est traitée comme un objet unique et vous obtenez un tableau d'objets 1D. C'est pourquoi votre troisième exemple fonctionne. Votre premier exemple ne fonctionne pas parce que vous essayez de lancer une séquence d'objets à des flottants, ce qui n'est pas possible. En bref, vous ne pouvez pas créer un tableau de flottants si vos sous-listes ont des longueurs différentes. Au mieux, vous pouvez créer un tableau de tableaux 1D, car ils sont toujours considérés comme des objets.

>>> x = np.array(list(map(np.array, [[2., 3.], [3.]]))) 
>>> x 
array([array([ 2., 3.]), array([ 3.])], dtype=object) 
>>> x[0] 
array([ 2., 3.]) 
>>> x[0][1] 
3.0 
>>> # but you can't do this 
>>> x[0,1] 
Traceback (most recent call last): 
    File "<pyshell#18>", line 1, in <module> 
    x[0,1] 
IndexError: too many indices for array 

Si vous êtes plié sur la création d'un tableau 2D flottante, vous devez étendre tous vos sous-listes à la même taille avec None, qui sera converti en np.nan.

>>> lists = [[2., 3.], [3.]] 
>>> max_len = max(map(len, lists)) 
>>> for i, sublist in enumerate(lists): 
    sublist = sublist + [None] * (max_len - len(sublist)) 
    lists[i] = sublist 

>>> np.array(lists, dtype=np.float32) 
array([[ 2., 3.], 
     [ 3., nan]], dtype=float32)