2016-01-28 43 views
2

我试图使我当前的代码具有动态性。这意味着无论用户的阵列输入数量如何,它都应该能够进行调整。基于x个其他数组的数组Slump numpy数组

当前代码:

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的交点。

我的目标是能够与array1array2的n个做到这一点...,n为my_list1数,my_list2 ...

提前感谢!

回答

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

完美的作品!非常感谢! –

+0

嗨!我认为它使用了三个数组和三个列表,但显然它只考虑了第二对数组列表。我们如何制作np.logical_并考虑2个以上的参数? –

+0

解决了这个问题。 –