我想删除包含超过50%空元素的数组中的行。
例如: 如果输入是
1 0 0 0 5 0
2 3 5 4 3 1
3 0 0 4 3 0
2 0 9 8 2 1
0 0 4 0 1 0
我想删除第1行和第5行,但保留其余部分。输出应如下所示:
2 3 5 4 3 1
3 0 0 4 3 0
2 0 9 8 2 1
我想用matlab
来做这件事答案 0 :(得分:3)
根据A
行的平均值,对行使用逻辑索引:
t = .5; % threshold
A(mean(A==0,2) > t, :) = [];
这是做什么的:
A
与0
进行比较:将零变为true
,将非零变为false
。等效地,您可以保留所需的行,而不是删除不需要的行。这可能会更快,具体取决于行的比例:
A = A(mean(A~=0,2) >= 1-t, :);
答案 1 :(得分:0)
您还可以同时使用standardizeMissing function和rmmissing function来实现此目标:
>> [~,tf] = rmmissing(standardizeMissing(A,0),'MinNumMissing',floor(0.5*size(A,2))+1);
>> A(~tf,:)
对standardizeMissing
的调用将0
值替换为NaN
(标准缺失指标为double),然后rmmissing
调用在逻辑向量中标识{{1具有超过50%条目的行为tf
(即那些具有超过0
0值条目的行。然后您可以否定floor(0.5*size(A,2))+1
输出并将其用作索引器。您可以轻松调整丢失的最小数量,以满足您想要的任何百分比标准。
另请注意,此处tf
是一个逻辑向量,它只是tf
行数的大小。
答案 2 :(得分:0)
正如我mentioned on Luis' answer,他的方法的一个缺点是它需要创建与A
相同大小的中间逻辑数组,这可能会在工作时产生显着的内存/性能损失大阵列。
使用nnz
的明确循环方法(为了清晰起见,过于冗长):
[nrows, ncols] = size(A);
maximum_ratio_of_zeros = 0.5;
minimum_ratio_of_nonzeros = 1 - maximum_ratio_of_zeros;
todelete = false(nrows, 1);
for ii = 1:nrows
if nnz(A(ii,:))/ncols < minimum_ratio_of_nonzeros
todelete(ii) = true;
end
end
A(todelete,:) = [];
返回所需答案。