Multiplying a tuple by a scalar

后端 未结 12 880
忘了有多久
忘了有多久 2020-12-14 14:48

I have the following code:

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

This will print:

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


        
相关标签:
12条回答
  • 2020-12-14 15:08

    Simplish thing if you're writing a bunch of code, but don't want a more complicated vector library...

    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)
    

    The "V" instances otherwise behave just like tuples. This requires that the "V" instances are all created with the same number of elements. You could add, for example, to __new__

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

    to enforce that all the instances are 2d vectors....

    0 讨论(0)
  • 2020-12-14 15:10

    Might be a nicer way, but this should work

    tuple([10*x for x in img.size])
    
    0 讨论(0)
  • 2020-12-14 15:10

    You are trying to apply the function on Tuple as a whole. You need to apply it on individual elements and return a new tuple.

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

    Remember you cannot change a Tuple.

    0 讨论(0)
  • 2020-12-14 15:13

    Solution:

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

    Explanation: arrays make direct scalar multiplication possible. Hence the tuple called set1 here is converted to an array. I assume you wish to keep using the tuple, hence we convert the array back to a tuple.

    This solution is to avoid the explicit and verbose for loop. I do not know whether it is faster or whether the exact same thing happens in both cases.

    0 讨论(0)
  • 2020-12-14 15:15
    img.size = tuple(i * 10 for i in img.size)
    
    0 讨论(0)
  • 2020-12-14 15:16

    There is probably a simpler way than this, but

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

    Will do nearly what you want, although it prints as a list rather than a tuple. Wrap the map call inside tuple(map...) if you want it to print as a tuple (parentheses rather than square brackets).

    0 讨论(0)
提交回复
热议问题