【问题标题】:Slice numpy array based on x number of other arrays根据 x 个其他数组对 numpy 数组进行切片
【发布时间】:2016-01-28 09:43:25
【问题描述】:

我正在尝试使我当前的代码动态化。这意味着无论用户的数组输入数量如何,它都应该能够进行调整。

当前代码:

main1 = numpy.array([1,2,3,4])
array1 = numpy.array(['a','b','c','b'])
my_list1 = ['a','b']
array2 = numpy.array(['cat','dog','bird','cat'])
my_list2 = ['cat']

result_array = main1[np.in1d(array1, my_list1) and np.in1d(array2, my_list2)]

打印出result_array的期望结果是:

array([1, 4])

这是因为acat & bcat 的交集。

我的目标是能够使用 n 个 array1array2 ... 和 n 个 my_list1my_list2... 来做到这一点。

提前致谢!

【问题讨论】:

    标签: python arrays numpy slice


    【解决方案1】:

    两个以上数组的版本,使用logical_and.reduce

    array3 = numpy.array(['cat3','dog3','bird3','cat3'])
    my_list3 = ['cat3']
    
    my_arrays = [array1, array2, array3]
    my_lists = [my_list1, my_list2, my_list3]
    res1 = main1[numpy.logical_and.reduce(tuple(np.in1d(array, lst) for 
                                                array, lst in zip(my_arrays, my_lists)))]
    

    测试一下:

    res2 = main1[np.in1d(array1, my_list1) & np.in1d(array2, my_list2) &
                 np.in1d(array3, my_list3)]
    

    看起来不错:

    >>> np.all(res1 == res2)
    True
    

    旧答案只有两个数组。

    这应该可行:

    my_arrays = [array1, array2]
    my_lists = [my_list1, my_list2]
    main1[np.logical_and(*(np.in1d(array, lst) for array, lst in zip(my_arrays, my_lists)))]
    

    结果:

    array([1, 4])
    

    【讨论】:

    • 完美运行!非常感谢!
    • 嗨!我认为它正在使用三个数组和三个列表,但显然它只考虑了第二对数组列表。我们如何使 np.logical_and 考虑超过 2 个参数?
    猜你喜欢
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    相关资源
    最近更新 更多