基于x个其他数组

时间:2016-01-28 09:43:25

标签: python arrays numpy slice

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

当前代码:

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 ...来执行此操作/ p>

提前致谢!

1 个答案:

答案 0 :(得分: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

Old只回答两个数组。

这应该有效:

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])