web-dev-qa-db-fra.com

Multiplier un tuple par un scalaire

J'ai le code suivant:

print(img.size)
print(10 * img.size)

Cela imprimera:

(70, 70)
(70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70)

Je voudrais qu'il imprime:

(700, 700)

Existe-t-il un moyen de le faire sans avoir à écrire:

print(10 * img.size[0], 10 * img.size[1])

PS: img.size est une image PIL. Je ne sais pas si cela importe dans ce cas.

46
devoured elysium

Cela pourrait être une meilleure façon, mais cela devrait fonctionner

Tuple([10*x for x in img.size])
54
Hannes Ovrén
img.size = Tuple(i * 10 for i in img.size)
34
truppo

La manière Pythonic serait d'utiliser une compréhension de liste:

y = Tuple([z * 10 for z in img.size])

Une autre façon pourrait être:

y = Tuple(map((10).__mul__, img.size))
14
ChristopheD

Solution:

set1=(70, 70)
Tuple(2*array(set1))

Explication: arrays permet la multiplication scalaire directe. D'où le Tuple appelé set1 ici est converti en array. Je suppose que vous souhaitez continuer à utiliser le Tuple, nous convertissons donc le array en Tuple.

Cette solution consiste à éviter la boucle explicite et verbeuse for. Je ne sais pas si c'est plus rapide ou si exactement la même chose se produit dans les deux cas.

6
Mukul Atri

Chose simple si vous écrivez un tas de code, mais que vous ne voulez pas d'une bibliothèque vectorielle plus compliquée ...

class V(Tuple):
    '''A simple vector supporting scalar multiply and vector add'''
    def __new__ (cls, *args):
        return super(V, cls).__new__(cls, args)
    def __mul__(self,s):
        return V( *( c*s for c in self) )
    def __add__(self,s):
        return V( *( c[0]+c[1] for c in Zip(self,s)) )
    def __repr__(self):
        return "V" + super(V, self).__repr__()

# As long as the "vector" is on the left it just works

xaxis = V(1.0, 0.0)
yaxis = V(0.0, 1.0)
print xaxis + yaxis      # => V(1.0, 1.0)
print xaxis*3 + yaxis*5  # => V(3.0, 5.0)
print 3*xaxis            # Broke, => (1.0, 0.0, 1.0, 0.0, 1.0, 0.0)

Les instances "V" se comportent autrement comme des tuples. Cela nécessite que les instances "V" soient toutes créées avec le même nombre d'éléments. Vous pouvez ajouter, par exemple, à __new__

if len(args)!=2: raise TypeError('Must be 2 elements')

pour faire en sorte que toutes les instances soient des vecteurs 2D ....

3
Marvin

Si vous rencontrez ce problème plus souvent et avec des tuples ou des listes plus grandes, vous souhaiterez peut-être utiliser la bibliothèque numpy , qui vous permet d'effectuer toutes sortes d'opérations mathématiques sur des tableaux. Cependant, dans cette situation simple, ce serait une surpuissance totale.

2
nikow

Il existe probablement un moyen plus simple que cela, mais

print map(lambda x: 10*x, img.size)

Fera presque ce que vous voulez, bien qu'il s'imprime comme une liste plutôt que comme un tuple. Enveloppez l'appel map à l'intérieur de Tuple(map...) si vous voulez qu'il s'imprime en tant que Tuple (entre parenthèses plutôt qu'en crochets).

2
sparklewhiskers

En ligne avec les réponses précédentes mais en utilisant numpy:

import numpy as np
result = Tuple(10*np.array(img.size))
1
user2750362

Vous pouvez essayer quelque chose comme ceci:

print [10 * s for s in img.size]

Il vous donnera une nouvelle liste avec tous les éléments que vous avez dans le Tuple multiplié par 10

1
Serge

Vous essayez d'appliquer la fonction sur Tuple dans son ensemble. Vous devez l'appliquer sur des éléments individuels et renvoyer un nouveau tuple.

newTuple = Tuple([10*x for x in oldTuple])

N'oubliez pas que vous ne pouvez pas modifier un tuple.

0
user2766147

n'ajouter que de la variété ..

import operator
img_size = (70, 70)
map(operator.mul, img_size, len(img_size)*(10,))
0
elbeardmorez