如何从2d数组中搜索行(索引)?

时间:2017-03-24 03:01:35

标签: python numpy

我有这样的2d数组(uni)。

0.012   396.470
0.017   401.480
0.028   406.490
0.030   408.505
0.032   411.500
0.038   416.510
0.043   421.520
0.046   426.530
0.050   430.050
0.051   431.540
0.050   436.540
0.047   438.540
0.050   441.550

和另一个2d数组search=[[0.030,408.505],[0.043,421.520],[0.050,430.050],[0.047,438.540]],我想得到搜索数组行找到的行的索引。 outindex = [3,6,8,11]

我也试试这个,但它给出了错误。 outindex= np.where((uni == (search[:,0],search[:,1])).all(axis=1)) AttributeError:'bool'对象没有属性'all'

2 个答案:

答案 0 :(得分:0)

可能有一个优雅的解决方案。但是您可以使用两个for循环来查找匹配项。假设数据是第一个数组的数组

[ii for i in search for ii,jj in enumerate(data) if (i == jj).all()]

结果

[3, 6, 8, 11]

答案 1 :(得分:0)

这是使用lexsort的O(n + k log(n + k))解决方案:

import numpy as np

def find(uni, search):
    conc = np.c_[uni.T, search.T]
    order = np.lexsort(conc)
    hits_u = np.where(np.all(np.diff(conc[:, order], axis=-1) == 0, axis=0))[0]
    swap = order[hits_u] >= len(uni)
    hits_s = hits_u + ~swap
    hits_u += swap
    inv = np.empty((len(search),), int)
    inv[order[hits_s]-len(uni)] = np.arange(len(search))
    return order[hits_u[inv]]

N = 10
k = 4
uni = np.random.random((N, 2))
search = uni[np.random.choice(range(N), (k,), replace=False), :]

print(uni)
print(search)
print(find(uni, search))

打印:

[[ 0.16031118  0.42371406]
 [ 0.25930474  0.75387238]
 [ 0.94759723  0.05881759]
 [ 0.30818273  0.67586559]
 [ 0.75808821  0.6391532 ]
 [ 0.41483904  0.29374653]
 [ 0.25989807  0.41540332]
 [ 0.53332782  0.95142508]
 [ 0.27351797  0.86468606]
 [ 0.15222195  0.07819565]]
[[ 0.30818273  0.67586559]
 [ 0.27351797  0.86468606]
 [ 0.25930474  0.75387238]
 [ 0.16031118  0.42371406]]
[3 8 1 0]