2012-07-23 47 views
0

說我有一個numpy的數組x:的Python:在numpy的陣列高效運營

x = array([[ 3, 2, 1], 
      [ 3, 25, 34], 
      [ 33, 333, 3], 
      [ 43, 32, 2]]) 

我要執行以下操作沒有明確地寫一個for循環即表示它使用內置的自動方法循環;

1)的所有1即

x = array([[ 3, 1, 1], 
      [ 3, 1, 34], 
      [ 33, 1, 3], 
      [ 43, 1, 2]]) 

2)在原始陣列的列替換第二列中,替換與第二和第三的產物第三列即

x = array([[ 3, 2, 1*2], 
      [ 3, 25, 34*25], 
      [ 33, 333, 3*333], 
      [ 43, 32, 2*32]]) 

3 )最後,我想根據條件替換原始陣列中的第二列,例如

x[1] = 0 if x[0] > 5 else 4 

即陣列現在看起來像:

x = array([[ 3, 4, 1], 
      [ 3, 4, 34], 
      [ 33, 0, 3], 
      [ 43, 0, 2]]) 

有什麼建議嗎? 謝謝!

+0

可以使用做了' while循環和每個循環遞增的迭代器變量。請問爲什麼你不能使用'for'循環? – Cheezey 2012-07-23 00:27:39

+0

該陣列可能會變得非常高,即表示可能會重複數百次的百萬個元素。使用明確的for循環會增加很多開銷。因此,我轉而使用'numpy array'來代替'lists',這樣跳躍就會出現某種向量化的解決方案。 – 2012-07-23 00:30:43

回答

6

上numpy的文檔是很值得一讀,因爲這是很基本的東西...

  1. x[:,1] = 1
  2. x[:,2] *= x[:,1]
  3. x[:,1] = np.where(x[:,0] > 5, 0, 4)
+0

Jon Clements:謝謝你!我索引的方式是錯誤的,比如x [:] [1] ..再次感謝! – 2012-07-23 00:37:59

+2

通過使用'x [:,2] * = x [:,1]'可以改進數字2,這樣可以節省創建臨時數組的時間。 – 2012-07-23 00:38:52

+0

@Sven好點 - 不知道爲什麼我沒有寫 - 謝謝 - 編輯 – 2012-07-23 00:39:55