使用numpy,我正在使用以下算法在单独的列表中查找列表元素的索引
IndexList = np.zeros(len(x))
for i in range(len(x)):
positionx = np.where(cx == x[i])
positiony = np.where(cy == y[i])
Index = np.intersect1d(positionx, positiony)
IndexList[i] = Index
这本身是非常快的,但是我想知道是否有更快的方法来达到相同的目的。有没有比numpy
更好的模块了?还是其他一些numpy
函数可以使此过程更快?可以使用pythonic方法或理解方法使这种代码片段更快吗?
最终,我想查看包含cx和cy的矩阵是否具有与两个列表中的当前x y对匹配的特定(x,y)坐标对。
示例:cx,cy x,y是一维numpy
数组
cx cy x y
45 30 20 10
20 10 19 13
44 53
19 13
在这种情况下,indexList = [1, 3]
答案 0 :(得分:2)
检查cx
和cy
中的哪个对等于x
和y
中的对
mask = (cx == x[:, None]) & (cy == y[:, None])
要获取cx
和cy
中存在的x
和y
中元素的索引,请使用
np.vstack(np.where(mask))[1]
# outputs: array([1, 3], dtype=int64)
获取存在于x
和y
中的cx
和cy
中的元素的索引
np.vstack(np.where(mask))[0]
# outputs: array([0, 1], dtype=int64)
基准代码:
%timeit op(cx, cy, x, y)
44.6 µs ± 616 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit hal(cx, cy, x, y)
8.57 µs ± 90.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
使用示例数据将速度提高5.2倍
# test methods
def op(cx, cy, x, y):
IndexList = np.zeros(len(x))
for i in range(len(x)):
px = np.where(cx == x[i])
py = np.where(cy == y[i])
Index = np.intersect1d(px, py)
IndexList[i] = Index
return IndexList
def hal(cx, cy, x, y):
mask = ( cx == x[:, None] ) & ( cy == y[:, None] )
return np.vstack(np.where(mask))[1]