2 回答
TA贡献1725条经验 获得超7个赞
以下功能基于indices比较,基于每个对角线都有索引关系,例如在主对角线处i==j,依此类推...
即使对非平方的2D数组也有效。
def flatten_diagonally(x, diags=None):
diags = np.array(diags)
if x.shape[1] > x.shape[0]:
diags += x.shape[1]-x.shape[0]
n = max(x.shape)
ndiags = 2*n-1
i,j = np.indices(x.shape)
d = np.array([])
for ndi in range(ndiags):
if diags != None:
if not ndi in diags:
continue
d = np.concatenate((d,x[i==j+(n-1)-ndi]))
return d
例子:
print flatten_diagonally(A)
#[ 7. 4. 8. 1. 5. 9. 2. 6. 3.]
print flatten_diagonally(A, diags=(1,2))
#[ 4. 8. 1. 5. 9.]
对于非平方数组:
A=np.array([[1,2,3],
[7,8,9]])
print flatten_diagonally(A, diags=(1,2))
#[ 1. 8. 2. 9.]
TA贡献1873条经验 获得超9个赞
这应该为您提供所需的输出:(请注意,第0个对角线是法线对角线,因此,如果您想使用对角线对角线,则可能需要为对角线使用负值。)
import numpy as np
def flatten_diagonally(npA, diagonals = None):
diagonals = diagonals or xrange(-npA.shape[0] + 1, npA.shape[1])
return np.concatenate(map(lambda x: np.diag(npA, k = x), diagonals))
请注意,您可以使用np.diagonal代替np.diag,但我不确定哪个效果更好。
添加回答
举报