【问题标题】:Remove element from 2d numpy array without loosing structure从 2d numpy 数组中删除元素而不丢失结构
【发布时间】:2014-10-12 13:54:49
【问题描述】:

我想从 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)

【问题讨论】:

    标签: python-3.x numpy


    【解决方案1】:

    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)
    

    这是一个由object 类型的2 个项目组成的数组。没有“结构”。这与列表列表基本相同

    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('?')
    

    【讨论】:

    • 感谢您指出这一点。我刚开始使用 numpy,并没有意识到我的代码中的列表/数组混淆。
    【解决方案2】:

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

    如果这只是一个选择不当的例子,您可以删除 ?通过选择所有非?元素:

    result = myarr[myarr!='?']
    

    【讨论】:

    • 如果 numpy 不支持这一点,上面示例中的“myarr”代表什么以及为什么在使用不支持的 np.array() 命令构造对象时没有收到错误消息np?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多