2016-07-26 43 views
1

位惱怒我一直無法得到這個自己,所以在這裏。調整numpy陣列軸的pythonic方法

說我有一個二維數組numpy的

import numpy as np 
a = np.array([[1,2,3],[4,5,6],[7,8,9]]) 

我在,我想爲0,這陣列中的列的情況,但保持原有的陣列。我可以

b = a.copy() 
b[:,1] = 0 

這樣做是爲了讓

array([[1, 0, 3], 
     [4, 0, 6], 
     [7, 0, 9]]) 

,或者如果我想零一系列的列,我可以做

b = a.copy() 
b[:,[0,3]] = 0 

得到

array([[0, 2, 0], 
     [0, 5, 0], 
     [0, 8, 0]]) 

b數組將只使用一個然後丟棄。

有沒有更多pythonic的方式來做到這一點,可以作爲一個班輪?我只想讓零值b數組通過一個繪圖程序,之後就不需要了。從本質上講,在調用繪圖函數之前,我不想額外增加兩行 - 如果我可以做到這一點,就像我打電話給我的例程一樣,它會更乾淨。例如

plotting_func(<numpy_magic_here>) 

代替

b = a.copy() 
b[:,1] = 0 
plotting_func(b) 

只爲永遠不會被再次使用

+0

我能想到的俏皮話,但不一定是更簡單,更可讀...... – Julien

+0

你爲什麼要創建了''的副本與零軸?是否可以改變你的繪圖功能,讓你只通過你關心的軸(即你不想要的零軸)?然後你可以在函數調用中用簡單的切片來完成它。 – user2229219

+3

你不能只是將'a [:,[不是零的列]]'傳遞給繪圖函數嗎? –

回答

2

B設置某些列爲零,你可以使用np.in1d非常久遠np.arange創建無效元素的面具,當它與輸入數組相乘時,將使用NumPy broadcasting將無效列設置爲零。因此,我們將有一個班輪實現,像這樣 -

a*~np.in1d(np.arange(a.shape[1]),cols_to_be_reset) 

另外,可以使用np.where來選擇,而不是乘,像這樣 -

np.where(np.in1d(np.arange(a.shape[1]),cols_to_be_reset),0,a) 

請注意,這並不意味着表現出色,但僅僅作爲單線。

採樣運行 -

In [546]: a 
Out[546]: 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 

In [547]: a*~np.in1d(np.arange(a.shape[1]),1) 
Out[547]: 
array([[1, 0, 3], 
     [4, 0, 6], 
     [7, 0, 9]]) 

In [548]: a*~np.in1d(np.arange(a.shape[1]),[0,2]) 
Out[548]: 
array([[0, 2, 0], 
     [0, 5, 0], 
     [0, 8, 0]]) 
+0

太好了 - 非常感謝!看起來像從其他一些評論中可以判斷的那樣好。接受答案。 – TJG