web-dev-qa-db-ja.com

タプルにスカラーを掛ける

私は次のコードを持っています:

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

これは印刷されます:

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

印刷したい:

(700, 700)

書くことなくこれを行う方法はありますか?

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

PS:img.sizeはPILイメージです。この場合、それが重要であればダンノ。

46

より良い方法かもしれませんが、これは動作するはずです

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

Pythonicの方法では、リストの内包表記を使用します。

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

別の方法は次のとおりです。

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

解決:

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

説明:arraysは、直接スカラー乗算を可能にします。したがって、Tupleset1ここではarrayに変換されます。 Tupleを使い続けたいと思うので、arrayTupleに戻します。

この解決策は、明示的で冗長なforループを回避することです。どちらの場合でも、それが速いのか、まったく同じことが起こるのかはわかりません。

6
Mukul Atri

大量のコードを記述しているが、より複雑なベクトルライブラリが必要ない場合は、単純なことです...

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)

それ以外の場合、「V」インスタンスはタプルのように動作します。これには、「V」インスタンスがすべて同じ数の要素で作成される必要があります。たとえば、__ new__に追加できます

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

すべてのインスタンスが2Dベクトルであることを強制する...

3
Marvin

この問題がより頻繁に発生し、より大きなタプルまたはリストがある場合、 numpy ライブラリを使用すると、配列に対してあらゆる種類の数学演算を実行できます。ただし、この単純な状況では、これは完全に過剰になります。

2
nikow

おそらくこれよりも簡単な方法がありますが、

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

タプルではなくリストとして出力されますが、ほぼ望みどおりに動作します。 map呼び出しをTuple(map...)内にラップして、タプル(角括弧ではなく括弧)として印刷する場合。

2
sparklewhiskers

前の回答と同じですが、numpyを使用します。

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

次のようなものを試すことができます:

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

Tupleにあるすべての要素に10を掛けた新しいリストが表示されます

1
Serge

Tuple全体に関数を適用しようとしています。個々の要素に適用して、新しいタプルを返す必要があります。

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

タプルは変更できないことに注意してください。

0
user2766147

多様性だけを追加します。

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