2017-10-21 38 views
1

這是我當前的代碼:如何在python中循環函數變量?

import numpy as np 

vec0 = [1, 2, 3] 
vec1 = [2, 3, 4] 
vec2 = [3, 4, 5] 
vec3 = [4, 5, 6] 

for k in range(0, 4): 
    globals()['mean%s' % k] = np.mean('vec'+str(k)) 

我得到這個錯誤:

TypeError: cannot perform reduce with flexible type


我想這個結果。用於計算意味着使用

globals()['mean%s' % k] = np.mean(vecs[k]) 

雖然,你應該避免這種做法並保持2D Array代替,這將是更容易:

mean0 = np.mean(vec0) 
mean1 = np.mean(vec1) 
mean2 = np.mean(vec2) 
mean3 = np.mean(vec3) 
+0

1)你不想被創建動態命名變量; 2)如果你正確使用numpy的,你可以使這個單一的二維數組,並採取行軸上的意思...... –

+0

這實際上是一種反模式,通常這是不好的設計,通過名稱調用變量。 –

回答

1

你可以這樣做:

vecs = [vec0, vec1, vec2, vec3] 

,然後行軸。

我的意思是,不是這個:

vec0 = [1, 2, 3] 
vec1 = [2, 3, 4] 
vec2 = [3, 4, 5] 
vec3 = [4, 5, 6] 

,你可以有這樣的事情:

vecs = np.array([[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]) 

,然後你可以簡單地計算這樣的手段:

meansArray = vecs.mean(axis=1) 

這將有你的mean0, mean1, mean2, mean3在各自的指數。

+0

然後'意味着= vecs.mean(axis = 1)'... –

+0

是的謝謝,正在編輯。 –

1

以名稱調用變量的反模式。如果您需要在多個對象上執行任務,則可以構建這些對象的集合(元組,列表等)。例如:

all_means = np.mean(all_vecs,axis=1) 

然後:

>>> all_means 
array([ 2., 3., 4., 5.]) 
1

你可以做到這一點

all_vecs = [vec0, vec1, vec2, vec3] 

而且您現在可以輕鬆地與numpy的通過指定axis參數處理的平均值在散裝通過改變:

globals()['mean%s' % k] = np.mean('vec'+str(k)) 

globals()['mean%s' % k] = np.mean(globals()['vec%s' % k]) 

但我強烈建議使用矢量來代替:

all_vec = [vec0, vec1, vec2, vec3]