2017-07-12 37 views
2

列刪除我試圖在同一時間從一個數組刪除每列一個,並根據文檔和this question上,認爲下列代碼應該起作用:numpy.delete不是從陣列

print(all_input_data.shape) 

for n in range(9): 
    print(n) 
    testArray = all_input_data.copy() 
    print(testArray.shape) 
    np.delete(testArray,[n],axis=1) 
    print(testArray.shape) 
    print(testArray[0:1][:]) 

原矩陣是all_input_data。

這不會導致任何列被刪除或對陣列產生任何其他更改。上面片段的初始輸出是:

(682120, 9) 

0 

(682120, 9) 

(682120, 9) 

[[ 2.37000000e+02 1.60000000e+01 9.90000000e+01 1.04910000e+03 
    9.29000000e-01 9.86000000e-01 8.43000000e-01 4.99290000e+01 
    1.97000000e+00]] 

delete命令根本不會改變矩陣的形狀。

+0

根據[文檔](https://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html),'numpy.delete'返回指定列被刪除的_copy_ 。還要注意,當連續刪除數組中的列時,對於n> = 5,'n'將無效。您應該使用'while'循環並始終刪除第一個循環。 –

回答

2

np.delete返回元素已被刪除的輸入數組的副本。

返回一個新的數組沿着刪除的軸子陣列。

numpy中沒有數組元素的刪除。

因爲np.delete返回一個副本,不修改輸入,無需手動進行的all_input_data副本:

import numpy as np 
all_input_data = np.random.rand(100, 9) 

for n in range(9): 
    print(n) 
    testArray = np.delete(all_input_data,[n],axis=1) 
    print(testArray.shape) 
    print(testArray[0:1][:]) 
+0

@a_guest我認爲你錯了,主要是因爲一個原因:'all_input_data'永遠不會被修改。剩下的就是這個。 – kazemakase

+0

@a_guets你錯了。該陣列在每次迭代中都不相同。也許你應該在評論之前嘗試運行代碼。根據我的理解,OP希望一次刪除一列**,而不是先後刪除。 – kazemakase

+0

原始數組在每次循環迭代中都被複制,這強烈建議不要修改數組。但推測自己的意圖是沒用的。 OP可能遲早會澄清這一點。 – kazemakase

1

從鏈接的問題考慮這個問題:

In [2]: a = np.arange(12).reshape(3,4) 

In [3]: np.delete(a, [1,3], axis=1) 
Out[3]: 
array([[ 0, 2], 
     [ 4, 6], 
     [ 8, 10]]) 

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

換句話說,如果你想保存更改,你應該保存到一個新的變量,但考慮到矩陣的大小,這是不實際的。你可以做的是使用切片符號索引。這是解釋here

+1

使用切片符號(實際上索引)來刪除單個列需要[高級索引](https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced-indexing),它也複製數組像'delete'。 – kazemakase

+0

感謝您指出。 – narn