2014-03-13 46 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