2014-10-12 79 views
0

我想从2d numpy数组中删除特定的字符。例如:从2d numpy数组中删除元素而不会丢失结构

myarr = np.array([[2,"?",5,2,3,6,8],[6,7,8,9,"?"]]) 

如何删除“?”没有失去阵列的结构?我的结果应该是这样的:

[[2,5,2,3,6,8] 
    [6,7,8,9]] 

(我是Win7的机器上使用Python 3.4.2和numpy的1.9)

回答

2

myarr = np.array([[2,"?",5,2,3,6,8],[6,7,8,9,"?"]])产生

array([[2, '?', 5, 2, 3, 6, 8], [6, 7, 8, 9, '?']], dtype=object) 

也就是说的2项object类型的阵列。没有一个“结构”。这与列表清单基本相同

mylist = [[2, '?', 5, 2, 3, 6, 8], [6, 7, 8, 9, '?']] 

一种简单的方法可以删除'?'是:

for l in mylist: 
    l.remove('?') 

但是,如果没有任何“?”,这会引发ValueError。在子列表中,并且如果存在多个,则不会删除全部。这两种错误都可以通过编写一个计算出现次数的小函数来解决,并删除正确的数字。你能处理那个功能吗?

所以问题归结为从列表(或列表数组)列表中删除选定的元素。


的“删除所有”功能,比我想象的简单:

def remove_all(a,x): 
    while x in a: 
     a.remove(x) 
for a in myarr: 
    a.remove_all('?') 
+0

谢谢你指出这一点。我刚刚开始使用numpy,并没有意识到代码中的列表/数组混乱。 – roschu 2014-10-14 06:18:09

2

numpy的阵列必须是“矩形”,即,所有的行/列必须有相同的长度。你的例子看起来像你需要一个“锯齿状数组”,numpy不支持。

如果这仅仅是一个糟糕的例子,你可以删除?通过选择所有非?元素:

result = myarr[myarr!='?'] 
+0

如果numpy的是不支持这个,有什么在上面的例子做“myArr,该”表示,为什么我得到没有错误消息当使用np不支持的np.array()命令构造对象时? – roschu 2014-10-13 05:45:44