2014-09-06 22 views
1

我想設置numpy數組的值如下。但我不想用for-loop。 有什麼好方法嗎?如何在2D numpy數組中設置多列而無需for-loop?

a = range(4) 
a[0] = [11,12,13,14,15,16] 
a[1] = [21,22,23,24,25,26] 
a[2] = [31,32,33,34,35,36] 
a[3] = [41,42,43,44,45,46] 

a = np.array(a) 

changeIndex = [0,2,4] 
for i in range(4): 
    a[i][changeIndex] = 0 

print a 
#array([[ 0, 12, 0, 14, 0, 16], 
#  [ 0, 22, 0, 24, 0, 26], 
#  [ 0, 32, 0, 34, 0, 36], 
#  [ 0, 42, 0, 44, 0, 46]]) 

回答

5

你基本上要訪問多列,您可以通過做:

a[:, changeIndex] = 0 

記住:

  1. 第一個索引選擇行,而第二個指標選擇列。
  2. 您可以使用列表或元組選擇多個索引。

更好的風格:

還爲您定義多維numpy的陣列或矩陣將是一個更好的辦法:

a = np.array([range(11,17), range(21,27), range(31, 37), range(41,47)]) 

而得益於一個評論,你實際上可以使用np.arange()代替range()以加快計算速度

矩陣:

在2D陣列上工作時,請考慮使用Matrix。矩陣在您對它們執行操作時保持其多維性質,您也可以對它們使用特殊的矩陣運算。閱讀here。他們的工作方式與陣列類似:

a = np.matrix([range(11,17), range(21,27), range(31, 37), range(41,47)]) 

有關相關線程供您參考here

+0

即使在這種情況下,使用'np.arange'的間隔比'range'小2倍。 – sebix 2014-09-06 08:24:54

+1

使用'np.vstack((...))'或類似的方法總是比'np.array([...])'快(我現在測試的是9x) – sebix 2014-09-06 08:43:00

1

我假設你不想用'for'循環遍歷所有行。隨着numpy,你不必這樣。

你可以使用

a[:, changeIndex] = 0 

隨着numpy的,changeIndex可以是整數(僅改變一列)或changeIndex可以是一個列表(從而允許您更改多個列)。

相關問題