根据第一个索引遍历数组

时间:2019-05-29 04:03:57

标签: python arrays loops numpy indexing

我有两个数组,我想遍历第二个数组,只返回其第一个元素等于另一个数组中的元素的数组。

 a = [10, 11, 12, 13, 14]
 b = [[9, 23, 45, 67, 56, 23, 54], [10, 8, 52, 30, 15, 47, 109], [11, 81, 
 152, 54, 112, 78, 167], [13, 82, 84, 63, 24, 26, 78], [18, 182, 25, 63, 96, 
 104, 74]]

我有两个不同的数组,a和b。我想找到一种方法来浏览b中的每个子数组(?),其中 第一个值等于数组a中的值以创建一个新数组c。

我正在寻找的结果是:

  c = [[10, 8, 52, 30, 15, 47, 109],[11, 81, 152, 54, 112, 78, 167],[13, 82, 84, 63, 24, 26, 78]]

Python是否具有以Excel具有MATCH()的方式执行此操作的工具?

我尝试了如下循环:

 for i in a:
      if i in b:
          print (b)

但是因为数组中还有其他元素,所以这种方式不起作用。任何帮助将不胜感激。

问题的进一步解释:

a = [5,6,7,9,12]

我使用XLRD(b_csv_data)读取了一个Excel文件:

 Start  Count   Error   Constant    Result1 Result2 Result3 Result4
 5       41       0       45             23      54      66       19
 5.4     44       1       21             52      35       6       50
 6       16       1       42             95      39       1       13
 6.9     50       1       22             71      86      59       97
 7       38       1       43             50      47      83       67
  8      26       1       29             100     63      15       40
 9       46       0       28             85       9      27       81
 12      43       0       21             74      78      20       85

接下来,我创建了一个外观以读取选定的行数。为简单起见,上面的这个文件只有几行。我当前的文件大约有100行。

for r in range (1, 7): #skipping headers and only wanting first few rows to start

     b_raw = b_csv_data.row_values(r) 
     b = np.array(b_raw) # I created this b numpy array from the line of code above

3 个答案:

答案 0 :(得分:2)

使用np.isin-

In [8]: b[np.isin(b[:,0],a)]
Out[8]: 
array([[ 10,   8,  52,  30,  15],
       [ 11,  81, 152,  54, 112],
       [ 13,  82,  84,  63,  24]])

对于已排序的a,我们还可以使用np.searchsorted-

idx = np.searchsorted(a,b[:,0])
idx[idx==len(a)] = 0
out = b[a[idx] == b[:,0]]

如果每行具有不同数量的元素的数组(本质上是列表的数组),则需要修改切片部分。因此,在这种情况下,请首先获取元素-

b0 = [bi[0] for bi in b]

然后,使用b0替换以前发布的方法中的b[:,0]的所有实例。

答案 1 :(得分:1)

使用列表理解:

c = [l for l in b if l[0] in a]

输出:

[[10, 8, 52, 30, 15], [11, 81, 152, 54, 112], [13, 82, 84, 63, 24]]

如果您的listarray很大,则使用numpy.isin可能会更快:

b[np.isin(b[:, 0], a), :]

基准:

a = [10, 11, 12, 13, 14]
b = [[9, 23, 45, 67, 56], [10, 8, 52, 30, 15], [11, 81, 152, 54, 112], 
 [13, 82, 84, 63, 24], [18, 182, 25, 63, 96]]

list_comp, np_isin = [], []
for i in range(1,100):
    a_test = a * i
    b_test = b * i
    list_comp.append(timeit.timeit('[l for l in b_test if l[0] in a_test]', number=10, globals=globals()))
    a_arr = np.array(a_test)
    b_arr = np.array(b_test)
    np_isin.append(timeit.timeit('b_arr[np.isin(b_arr[:, 0], a_arr), :]', number=10, globals=globals()))

enter image description here

虽然不清楚和简洁,但如果list小于100,我建议您使用b理解。否则,numpy是您的理想选择。

答案 2 :(得分:0)

您正在反向进行。最好遍历b数组的元素并检查a中是否存在它。如果是,则打印b的元素。请参阅下面的答案。

a = [10, 11, 12, 13, 14]
b = [[9, 23, 45, 67, 56, 23, 54], [10, 8, 52, 30, 15, 47, 109], [11, 81, 152, 54, 112, 78, 167], [13, 82, 84, 63, 24, 26, 78], [18, 182, 25, 63, 96, 104, 74]]

for bb in b:  # if you want to check only the first element of b is in a
    if bb[0] in a:
            print(bb)

for bb in b:   # if you want to check if any element of b is in a
    for bbb in bb:
        if bbb in a:
            print(bb)

输出:

[10, 8, 52, 30, 15, 47, 109]
[11, 81, 152, 54, 112, 78, 167]
[13, 82, 84, 63, 24, 26, 78]