我在Octave中有一个13146 x 13146矩阵,我想确定它的唯一行.unique(M, "rows")
由于Octave内部和/或内存限制而失败.
我查看了其他有关查找唯一行的帖子,但没有一个用大型矩阵解决了这个问题.
我现在的方法是"分而治之",例如通过
A(:,:,i)=M(r_i:s_i,:)
B(:,:,i)=unique(A(:,:,i), "rows")
Run Code Online (Sandbox Code Playgroud)
与i
子矩阵的指数,r_i
和s_i
子矩阵的开始和结束的行号.要将所有数据返回到一个大矩阵(并再次确定唯一行):
C(:,:,i)=B(:,:,i)'
D=reshape(C,l,n*m)
E=D'
F=unique(E, "rows")
Run Code Online (Sandbox Code Playgroud)
使用n
子矩阵的数量,子矩阵中m
的原始行l
数和列数.
有没有更好的方法来达到预期的效果?
我有一个三维数组
A=np.array([[[1,1], [1,0]], [[1,2], [1,0]], [[1,0], [0,0]]])
现在我想获得一个在给定位置具有非零值的数组,如果在该位置只出现唯一的非零值(或零).如果在该位置仅出现零或多于一个非零值,则它应该为零.对于上面的例子,我想
[[1,0], [1,0]]
以来
A[:,0,0]
那里只有1
sA[:,0,1]
有0
,1
和2
,所以一个以上的非零值A[:,1,0]
有0
和1
,所以1
被保留A[:,1,1]
那里只有0
s我可以找到有多少非零元素np.count_nonzero(A, axis=0)
,但我想保留1
s或2
s,即使它们有几个.我看了一下,np.unique
但它似乎不支持我想做的事情.
理想情况下,我喜欢一个函数np.count_unique(A, axis=0)
,它会以原始形状返回一个数组,例如[[1, 3],[2, 1]]
,所以我可以检查是否发生了3个或更多,然后忽略该位置.
所有我能想到的是一个列表理解迭代我想要获得的
[[len(np.unique(A[:, i, j])) for j in range(A.shape[2])] for i in range(A.shape[1])]
还有其他想法吗?