获取满足Python中条件的矩阵的行索引
Obtaining row indices of a matrix that satisfies a condition in Python
我一直在尝试获取包含元素 nd 的矩阵 (A) 的所有行索引。
A的大小是4M*4,这个操作需要~12秒。
Link 到文件:data
# Download the file named elementconnectivity before running this small script
A=np.loadtxt('elementconnectivity')
A=A.astype(int)
nd=1103
v=[i for i in range(len(A)) if nd in A[i]]
有没有更快的方法来完成这个?
我认为更好的方法是使用迭代器而不是列表
idxs = (i for i in xrange(len(A)) if nd in A[i])
idxs.next()
既然你一直在使用 numpy
,那么使用更多的 numpy 函数可以大大加快速度。您当前在我的系统上使用的方法:
%timeit v=[i for i in range(len(A)) if nd in A[i]]
1 loop, best of 3: 4.23 s per loop
相反,这快了大约 40 倍:
%timeit v = np.where(np.sum((A == nd), axis=1) > 0)
10 loops, best of 3: 92.2 ms per loop
您还可以查看 np.in1d
,它类似于我上面使用的 A == nd
,但可以与列表进行比较(类似于 A == nd1 或 nd2 或 nd3)。
我一直在尝试获取包含元素 nd 的矩阵 (A) 的所有行索引。
A的大小是4M*4,这个操作需要~12秒。
Link 到文件:data
# Download the file named elementconnectivity before running this small script
A=np.loadtxt('elementconnectivity')
A=A.astype(int)
nd=1103
v=[i for i in range(len(A)) if nd in A[i]]
有没有更快的方法来完成这个?
我认为更好的方法是使用迭代器而不是列表
idxs = (i for i in xrange(len(A)) if nd in A[i])
idxs.next()
既然你一直在使用 numpy
,那么使用更多的 numpy 函数可以大大加快速度。您当前在我的系统上使用的方法:
%timeit v=[i for i in range(len(A)) if nd in A[i]]
1 loop, best of 3: 4.23 s per loop
相反,这快了大约 40 倍:
%timeit v = np.where(np.sum((A == nd), axis=1) > 0)
10 loops, best of 3: 92.2 ms per loop
您还可以查看 np.in1d
,它类似于我上面使用的 A == nd
,但可以与列表进行比较(类似于 A == nd1 或 nd2 或 nd3)。