2014-03-13 52 views
2

我用下面的線陣列的列表:如何刪除在陣列就地項

list_split_test_array = np.split(test_array, np.where(test_array == 0.)[0]) 

在每個分割爲0的數組,即我任意先前添加作爲佔位符的值。
這給了我一個陣列的列表,其中每個數組的第0個索引(除了第一個數組)都是0. 如何刪除這些0的就地,以獲得沒有佔位符0的數組列表?我說就地,因爲我寧願不迭代,添加刪除0每個數組到一個新的數組列表。

+0

這些嵌套列表是否都是相同的長度(第一個除外)?如果是這樣的話,你可以在第一列加上'0',將它轉換爲二維數組,並刪除第一列。 – hpaulj

+0

我想過這個。很不幸的是,不行。我最終希望將輸出作爲DataFrame,其中每列是來自此列表的數組。如果是這種形式,我認爲我應該可以按照你的建議做,但我仍然在努力研究df格式 – user3416961

+1

迭代並對array_list中的項[item [1:]進行操作)相當快速。它不會複製數組。這基本上是你要求的。你實際上不能在原地從numpy數組中刪除一個項目。如果你想查看除了第一個項目以外的所有內容,但不做複製,只需要執行'item [1:]'(如上)。 –

回答

1

你可以使用一些預處理去除零,這裏有一個例子:

import numpy as np 
a = np.random.randint(0, 5, 100) 
idx = np.where(a == 0)[0] 

np.split(a, idx) 

輸出:

[array([4, 3]), 
array([0, 3, 1, 1]), 
array([0, 4]), 
array([0]), 
array([0, 1, 2, 4]), 
array([0, 4, 2, 2, 3, 1]), 
array([0, 2, 4, 3]), 
array([0, 2, 2, 4]), 
array([0, 3, 2, 1, 2, 4, 1, 2]), 
array([0]), 
array([0]), 
array([0, 1, 3]), 
array([0]), 
array([0, 1, 3, 2, 4]), 
array([0, 3, 3]), 
array([0, 3]), 
array([0, 3, 4, 1, 2, 3, 3, 4, 3, 4, 2, 1]), 
array([0]), 
array([0, 3, 2]), 
array([0]), 
array([0, 4, 1, 4, 2, 3, 1]), 
array([0, 4]), 
array([0]), 
array([0]), 
array([0, 3, 4, 2, 3]), 
array([0, 4, 4, 3, 3, 3, 1]), 
array([0, 2, 4, 1]), 
array([0, 4, 2, 2]), 
array([0])] 

撤除a全部爲零,並計算新的索引:

idx2 = idx - np.arange(len(idx)) 
b = np.delete(a, idx) 
np.split(b, np.unique(idx2)) 

這是輸出:

[array([4, 3]), 
array([3, 1, 1]), 
array([4]), 
array([1, 2, 4]), 
array([4, 2, 2, 3, 1]), 
array([2, 4, 3]), 
array([2, 2, 4]), 
array([3, 2, 1, 2, 4, 1, 2]), 
array([1, 3]), 
array([1, 3, 2, 4]), 
array([3, 3]), 
array([3]), 
array([3, 4, 1, 2, 3, 3, 4, 3, 4, 2, 1]), 
array([3, 2]), 
array([4, 1, 4, 2, 3, 1]), 
array([4]), 
array([3, 4, 2, 3]), 
array([4, 4, 3, 3, 3, 1]), 
array([2, 4, 1]), 
array([4, 2, 2]), 
array([], dtype=float64)] 
+0

我最終用熊貓數據框來做這件事。事實證明,我並不需要全部拆分和清理,但感謝您的幫助和解決問題的良方! – user3416961