我有这样的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'
答案 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]