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