Python:矩阵的非对角线元素为0
Python: Non diagonal elements of a matrix to 0
将方形对称 numpy ndarray 的非对角线元素转换为 0 的最快方法是什么?
我会检查保存对角线的速度,然后切换矩阵,然后恢复对角线:
n = len(mat)
d = mat.ravel()[::n+1]
values = d.copy()
mat[:,:] = 0
d[:] = values
如果矩阵不是很大,但是分配一个新矩阵可能会更快
mat = numpy.diag(numpy.diag(mat))
这是一个也适用于非连续数组的解决方案:
a = np.arange(110).reshape(10, 11)[:, :10]
diag = np.einsum('ii->i', a)
# or if a is not guaranteed to be square
# mn = min(a.shape)
# diag = np.einsum('ii->i', a[:mn, :mn])
save = diag.copy()
a[...] = 0
diag[...] = save
a
# array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
# [ 0, 12, 0, 0, 0, 0, 0, 0, 0, 0],
# [ 0, 0, 24, 0, 0, 0, 0, 0, 0, 0],
# [ 0, 0, 0, 36, 0, 0, 0, 0, 0, 0],
# [ 0, 0, 0, 0, 48, 0, 0, 0, 0, 0],
# [ 0, 0, 0, 0, 0, 60, 0, 0, 0, 0],
# [ 0, 0, 0, 0, 0, 0, 72, 0, 0, 0],
# [ 0, 0, 0, 0, 0, 0, 0, 84, 0, 0],
# [ 0, 0, 0, 0, 0, 0, 0, 0, 96, 0],
# [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 108]])
将方形对称 numpy ndarray 的非对角线元素转换为 0 的最快方法是什么?
我会检查保存对角线的速度,然后切换矩阵,然后恢复对角线:
n = len(mat)
d = mat.ravel()[::n+1]
values = d.copy()
mat[:,:] = 0
d[:] = values
如果矩阵不是很大,但是分配一个新矩阵可能会更快
mat = numpy.diag(numpy.diag(mat))
这是一个也适用于非连续数组的解决方案:
a = np.arange(110).reshape(10, 11)[:, :10]
diag = np.einsum('ii->i', a)
# or if a is not guaranteed to be square
# mn = min(a.shape)
# diag = np.einsum('ii->i', a[:mn, :mn])
save = diag.copy()
a[...] = 0
diag[...] = save
a
# array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
# [ 0, 12, 0, 0, 0, 0, 0, 0, 0, 0],
# [ 0, 0, 24, 0, 0, 0, 0, 0, 0, 0],
# [ 0, 0, 0, 36, 0, 0, 0, 0, 0, 0],
# [ 0, 0, 0, 0, 48, 0, 0, 0, 0, 0],
# [ 0, 0, 0, 0, 0, 60, 0, 0, 0, 0],
# [ 0, 0, 0, 0, 0, 0, 72, 0, 0, 0],
# [ 0, 0, 0, 0, 0, 0, 0, 84, 0, 0],
# [ 0, 0, 0, 0, 0, 0, 0, 0, 96, 0],
# [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 108]])