Forums » Questions générales »
Tableau constant sous numpy
Ajouté par Simon Lopez il y a plus de 13 ans
Bonjour,
Savez-vous si il existe une matiere native et efficace de disposer d'un tableau numpy ne contenant qu'une valeur (scalaire, vecteur...) mais exposant l'interface d'un tableau n-dimensionnel (cf. l'exemple dans le fichier joint).
Bonne journée,
Simon
ConstantArray.py
(761 octets)
Réponses (7)
RE: Tableau constant sous numpy - Ajouté par Farid Smai il y a plus de 13 ans
Yop,
J'imagine que tu n'ignores pas que l'exemple suivant marche parfaitement:
>>> a = 2 # tout simplement >>> v = numpy.arange(4) >>> v.shape = (2,-1) >>> v[:,0]+a array([ 2., 4.])
Sinon, qu'est-ce qui marche pas dans ton exemple?
Farid
RE: Tableau constant sous numpy - Ajouté par Simon Lopez il y a plus de 13 ans
J'imagine que tu n'ignores pas que l'exemple suivant marche parfaitement:
Oui j'ai branché mon ordinateur ! ;-)
Ce qui ne marche pas c'est :
>>> v[:,0]+a[:,0]
or j'aimerais pouvoir avoir des formules génériques pour le cas ou a est un tableau.
Cependant lorsque ce tableau est rempli de toujours la même valeur je trouve bête de gaspiller de la mémoire.
Tu me diras peut-être de faire :
>>> (v+a)[:,0]
mais je calcule tout v+a pour rien.
Il y a peut-être une astuce mais elle ne me saute pas aux yeux.
A+
Simon
RE: Tableau constant sous numpy - Ajouté par Farid Smai il y a plus de 13 ans
Je suis d'accord que
>>> (v+a)[:,0]
est largement sous efficace.
Par contre, je viens de faire ça chez moi :
>>> class C(object): ... def __init__(self, value): ... self.value = value ... def __getitem__(self, index): ... return self.value ... >>> import numpy as np >>> a=C(2) >>> v = np.arange(4) >>> v.shape = (2,-1) >>> v[:,0] + a[:,0] array([2, 4])
et ça marche au poil.
J'ai raté quelque chose ?
Farid
RE: Tableau constant sous numpy - Ajouté par Simon Lopez il y a plus de 13 ans
J'ai raté quelque chose ?
Heu... peut-etre le fichier que j'avais attaché au message initial et ma phrase "(cf. l'exemple dans le fichier joint)." ? :-)
Tu lis ton message dans la messagerie ou sur le forum ?
Simon
RE: Tableau constant sous numpy - Ajouté par Farid Smai il y a plus de 13 ans
Je n'ai pas raté ton fichier joint.
Par contre, qu'entends-tu par
Ce qui ne marche pas c'est :
>>> v[:,0]+a[:,0]
Je ne comprends pas car pour moi ça marche.
RE: Tableau constant sous numpy - Ajouté par Simon Lopez il y a environ 12 ans
Juste pour info, le comportement que je voulais obtenir peut être obtenu par :
>>> from numpy.lib.stride_tricks import as_strided
>>> help(as_strided)
Help on function as_strided in module numpy.lib.stride_tricks:
as_strided(x, shape=None, strides=None)
Make an ndarray from the given array with the given shape and strides.
>>> v=as_strided(np.array([5]), shape=(2,5), strides=(0,0))
>>> v
array([[5, 5, 5, 5, 5],
[5, 5, 5, 5, 5]])
qui permet de pointer vers la zone mémoire d'un numpy array en lui donnant une façon de la parcourir (l'argument strides), ce qui permet à numpy de faire du broadcast et de généré des "vues" d'un tableau.
De manière logique quand on accède à un élément quelconque du tableau on les modifie tous (puisqu'il y a une seule case mémoire) :
>>> v[1,1] = 3
>>> v
array([[3, 3, 3, 3, 3],
[3, 3, 3, 3, 3]])
Mais attention aux surprises:
>>> v+=1
>>> v
array([[13, 13, 13, 13, 13],
[13, 13, 13, 13, 13]])
Puisque l'on parcoure le tableau en faisant :
>>> from itertools import product >>> for i,j in product(range(2), range(5)): ... v[i,j] = v[i,j]+1
On fait donc 10 fois l'incrémentation... d'ou le résultat.
Simon
PS: Merci Farid :-)
(1-7/7)