【问题标题】:Filtering array of arrays过滤数组数组
【发布时间】:2020-06-24 21:12:53
【问题描述】:

我有这个包含位置和时间信息的数组:

my_array[:5]
[['39.921712' '116.472343' '0' '13' '39298.1462037037' '2007-08-04' '03:30:32']
 ['42.161385' '123.660773' '0' '221' '39298.6697337963' '2007-08-04' '16:04:25']
 ['42.161755' '123.66135' '0' '221' '39298.6697569444' '2007-08-04' '16:04:27']
 ['42.16194' '123.661638' '0' '221' '39298.6697685185' '2007-08-04' '16:04:28']
 ['39.907285' '116.448303' '0' '98' '39298.1581134259' '2007-08-04' '03:47:41']]

每个数组的第一个和第二个元素是位置的latitudelongitude

我想过滤 my_array 以仅包含 latitude 介于 39.45 - 40.05longitude 介于 115.416 - 117.5 之间的数组。

预期结果:

my_array_sorted
[['39.921712' '116.472343' '0' '13' '39298.1462037037' '2007-08-04' '03:30:32']
 ['39.907285' '116.448303' '0' '98' '39298.1581134259' '2007-08-04' '03:47:41']]

【问题讨论】:

  • 你试过代码吗?有错误吗?
  • 这些是numpy数组还是python列表?

标签: python arrays multidimensional-array


【解决方案1】:

您可以通过列表推导来做到这一点:

data = [['39.921712', '116.472343', '0', '13', '39298.1462037037', '2007-08-04', '03:30:32'],
 ['42.161385', '123.660773', '0', '221', '39298.6697337963', '2007-08-04', '16:04:25'],
 ['42.161755', '123.66135', '0', '221', '39298.6697569444', '2007-08-04', '16:04:27'],
 ['42.16194', '123.661638', '0', '221', '39298.6697685185', '2007-08-04', '16:04:28'],
 ['39.907285', '116.448303', '0', '98', '39298.1581134259', '2007-08-04', '03:47:41'],]

filtered = [i for i in data
            if 39.45 < float(i[0]) < 40.05
            and 115.416 < float(i[1]) < 117.5]

print(filtered)

输出:

[['39.921712', '116.472343', '0', '13', '39298.1462037037', '2007-08-04', '03:30:32'],
['39.907285', '116.448303', '0', '98', '39298.1581134259', '2007-08-04', '03:47:41']]

【讨论】:

    【解决方案2】:

    您应该查看接受谓词和您的列表的python's filter method,并只保留完成谓词的元素。

    这是从上述文档中摘录的示例:

    number_list = range(-5, 5)
    less_than_zero = list(filter(lambda x: x < 0, number_list))
    print(less_than_zero)
    
    # Output: [-5, -4, -3, -2, -1]
    

    在您的情况下,它应该如下所示:

    my_array_sorted = list(filter(lambda array: 39.45 < array[0] < 40.05 and 115.416 < array[1] < 117.5))
    

    【讨论】:

    • SO 上的另一个用户向我展示了很多内置的 python 函数,如过滤器、映射等,有趣的是,在许多情况下,理解更快,也更“pythonic”,并且更容易阅读
    • @TenaciousB 回调对于 python 新手来说有点难以理解。我个人习惯使用 lambda,因为我来自 Java,我们有 ConsumerPredicate 等。但基本上这两种方法都有效,只是口味问题。
    猜你喜欢
    • 1970-01-01
    • 2018-06-02
    • 2017-10-29
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多