2012-10-16 67 views
-2

爲什麼我的列表理解不起作用?我嘗試在矩陣中縮放隨機數。它用作lambda函數,但不是列表理解。我究竟做錯了什麼?我的列表理解不起作用

import numpy as np 
import pylab as pl 
def RandomSource(N,x0,x1,y0,y1,c0,c1): 
    randSources = np.random.random((N,3)) 
    # print to double-check agruments of the function 
    print 'This are scaling values %s %s %s %s %s %s %s' % (N,x0,x1,y0,y1,c0,c1) 
    # below should scale a whole matrix 
    [x0 + x*(x1-x0) for x in randSources[:,0]] 
    [y0 + y*(y1-y0) for y in randSources[:,1]] 
    [c0 + c*(c1-c0) for c in randSources[:,2]] 
    return randSources 

xS = 10 
yS = -100 
cS = 5 
N = 1000 
newPoints = RandomSource(N,xS-5,xS+5,yS-3,yS+2,cS-1,cS+2) 

print type(newPoints) 
print 'newPoints x = %s' % newPoints[0,0] 
print '\nnewPoints = %s\nnewX = %s \nnewY = %s' % (newPoints[0:10], newPoints[0:10,0],     newPoints[0:10,1]) 

pl.scatter(newPoints[:,0], newPoints[:,1], s=20, c=newPoints[:,2], marker = 'x') 
pl.show() 

輸出:

newPoints = [[ 0.34890398 0.65918009 0.8198278 ] 
      [ 0.47497993 0.98015398 0.23980164] 
      [ 0.86359112 0.10184741 0.24804018]] 

,但預計這樣的:

newPoints = [[ 6.4124458 -99.77854982 5.60905745] 
      [ 9.04459454 -99.63120435 4.08184828] 
      [ 14.94181747 -98.50800397 4.95530916]] 
+3

你得到了什麼輸出?你在期待什麼? –

+0

我沒有錯誤,它只是不縮放,我寫清楚我期望縮放矩陣 – tomasz74

+1

@ tomasz74你必須問我們一個實際問題,而不是隱約抱怨你不喜歡你自己的代碼。 – Marcin

回答

4

列表內涵不改變列表;它會創建一個全新的列表。你必須指定理解的結果存儲結果:

def RandomSource(N,x0,x1,y0,y1,c0,c1): 
    randSources = np.random.random((N,3)) 
    # print to double-check agruments of the function 
    print 'This are scaling values %s %s %s %s %s %s %s' % (N,x0,x1,y0,y1,c0,c1) 
    # below should scale a whole matrix 
    #[x0 + x*(x1-x0) for x in randSources[:,0]] 
    randSources[:,0] = map(lambda x: x0 + x*(x1-x0), randSources[:,0]) 

    randSources[:,1] = [y0 + y*(y1-y0) for y in randSources[:,1]] 
    randSources[:,2] = [c0 + c*(c1-c0) for c in randSources[:,2]] 
    return randSources 

注:我不知道這作業就可以了(randSources[:,1] = ...),但這是一般的想法。一個更簡單的例子:

>>> l = [1, 2, 3, 4, 5] 
>>> [i*2 for i in l] 
[2, 4, 6, 8, 10] 
>>> l 
[1, 2, 3, 4, 5] 
>>> l = [i*2 for i in l] 
>>> l 
[2, 4, 6, 8, 10]