2009-11-23 43 views
27

我有以下代碼:由標量乘以一個元組

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圖像。不知道在這種情況下,這件事情是否重要。

+3

出了什麼問題'(10 * img.size [0],10 * IMG。尺寸[1])'?我不明白爲什麼你需要過多地處理一些簡單的事情,比如兩個整數的乘法。請注意,這個元組將永遠只有兩個元素! – paprika 2009-11-23 09:26:31

+7

我不是過度工程。我在問是否有更好,更簡單的方法。再次閱讀我的文章。 – 2009-11-23 09:30:34

+3

@paprika:...因爲這個元組可能沒有已知的長度。在這種情況下,它確實(就像它引發我這個問題的情況一樣),但是編碼假定的元組長度,重複標量* n *次,並且必須正確地得到* n *索引足以避免如果直接可能的話。 – J0e3gan 2015-02-23 02:27:10

回答

32

可能是一個更好的方式,但這應該工作

tuple([10*x for x in img.size]) 
+12

稍好一點:'元組(10 * x for img.size)' – Vegard 2015-08-26 19:11:05

+0

https://stackoverflow.com/a/48351745/500902更好。拍拍自己的背部。 – Marvin 2018-01-20 01:32:42

1

你可以嘗試這樣的事情:

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

它會給你所有你在有元素的新列表元組乘以10

13

pythonic方式會使用list理解:

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

另一種方式可以是:

y = tuple(map((10).__mul__, img.size)) 
+0

第二個是真棒......哈哈。 – 2009-11-26 20:29:18

+2

這兩個例子都沒有捕捉到問題的關鍵。兩者都迫使程序員採取一個簡單的想法(標量時間矩陣乘法)並對其進行解構。 – 2014-12-08 20:32:03

24
img.size = tuple(i * 10 for i in img.size) 
3

有可能是比這更簡單的方法,但

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

會做幾乎你想要什麼,但它打印爲列表而不是元組。如果您想將其打印爲元組(括號而不是方括號),請將map調用回tuple(map...)

2

如果您遇到此問題的頻率更高,並且使用更大的元組或列表,那麼您可能需要使用numpy庫,該庫允許您對陣列執行各種數學運算。然而,在這種簡單的情況下,這將是完全矯枉過正的。

+0

儘管* simple *示例會使用numpy,但這個問題的重點似乎是「Python提供了一種模擬操作可以簡單地用數學表達的方式嗎?」我的意思是如果你有矩陣A = [70 70],那麼2A = [140 140]。 – 2014-12-08 20:28:30

0

添加什麼,但各種..

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

解決方案:

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

說明:arrays進行直接的標量乘法運算。因此,tuple在這裏被稱爲set1轉換爲array。我假設你希望繼續使用tuple,因此我們將array轉換回tuple

此解決方案是爲了避免顯式和詳細for循環。我不知道這是否更快,或者兩種情況下是否發生完全相同的事情。

+1

據我所知,這在Python 2或3中不起作用。我假設'array'來自'array'模塊? Python期望一個字符作爲'array'的第一個參數,因此只傳遞一個元組將失敗,並且TypeError:array()參數1或typecode必須是char(長度爲1的字符串或ascii-unicode),而不是元組。你能用更完整的例子來展開這個嗎? – Kumba 2017-08-14 22:58:47

1

在與前行的答案,但使用numpy的:

import numpy as np 
result = tuple(10*np.array(img.size)) 
0

您嘗試在元組應用功能爲一體。 您需要將其應用於單個元素並返回一個新的元組。請注意,您不能更改元組。

0

Simplish的事情,如果你正在寫一串代碼,但不希望有一個更復雜的矢量庫...

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向量....