我有两个数组,我想遍历第二个数组,只返回其第一个元素等于另一个数组中的元素的数组。
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
答案 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]]
如果您的list
或array
很大,则使用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()))
虽然不清楚和简洁,但如果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]