【问题标题】:Reshaping vector with indices in python在python中使用索引重塑向量
【发布时间】:2013-12-03 17:17:53
【问题描述】:

我在 python 中调整列表大小时遇到​​了一些问题。我有一个带有 -9999999 作为元素的向量 (A)。我想找到那些元素删除它们并删除B中的相应元素。

我尝试像这样索引非 -9999999 值:

i = [i for i in range(len(press)) if press[i] !=-9999999]

但是当我尝试使用索引来重塑 press 和我的其他向量时出现错误。 类型错误:列表索引必须是整数,而不是列表

向量的长度约为 26000

基本上,如果我有向量 A,我想从 A 中删除 -9999999 个元素,在 B 中删除 65 和 32。

A = [33,55,-9999999,44,78,22,-9999999,10,34]
B = [22,33,65,87,43,87,32,77,99]

【问题讨论】:

    标签: python sorting vector indexing


    【解决方案1】:

    由于您提到了vector,所以我认为您正在寻找基于NumPy 的解决方案:

    >>> import numpy as np
    >>> a = np.array(A)
    >>> b = np.array(B)
    >>> b[a!=-9999999]
    array([22, 33, 87, 43, 87, 77, 99])
    

    使用itertools.compress的纯Python解决方案:

    >>> from itertools import compress
    >>> list(compress(B, (x != -9999999 for x in A)))
    [22, 33, 87, 43, 87, 77, 99]
    

    时间比较:

    >>> A = [33,55,-9999999,44,78,22,-9999999,10,34]*10000
    >>> B = [22,33,65,87,43,87,32,77,99]*10000
    >>> a = np.array(A)
    >>> b = np.array(B)
    >>> %timeit b[a!=-9999999]
    100 loops, best of 3: 2.78 ms per loop
    >>> %timeit list(compress(B, (x != -9999999 for x in A)))
    10 loops, best of 3: 22.3 ms per loop
    

    【讨论】:

    • 我认为你不需要np.where 电话 (+1)
    • 我认为你根本不需要 numpy 来完成这项任务
    • @justinls 你不需要它,但是有了 26000 个元素,它会快很多。
    【解决方案2】:
    A = [33,55,-9999999,44,78,22,-9999999,10,34]
    B = [22,33,65,87,43,87,32,77,99]
    A1, B1 = (list(x) for x in zip(*((a, b) for a, b in zip(A, B) if a != -9999999)))
    print(A1)
    print(B1)
    

    这会产生:

    [33, 55, 44, 78, 22, 10, 34]
    [22, 33, 87, 43, 87, 77, 99]
    

    【讨论】:

      【解决方案3】:
      c = [j for i, j in zip(A, B) if i != -9999999]
      

      zip 合并两个列表,创建对 (x, y) 的列表。使用列表推导,您可以过滤 A 中为 -999999 的元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-23
        • 2021-01-25
        • 1970-01-01
        • 2016-04-05
        • 1970-01-01
        • 2010-10-24
        • 2015-07-04
        • 1970-01-01
        相关资源
        最近更新 更多