Python MatLab(或任何其他语言)转换矩阵或csv,以便在第一列值相同时将第二列值放入同一行?
比如我有 第1列|第2列 我想把它转换成 第1列|第2列|第3列|第4列 (3,4)元素应为空 我可以通过Matlab使用for和if来实现,但是对于海量数据来说,这需要花费太多的时间,所以我需要一个更优雅、更出色的想法 我更喜欢Matlab,但其他语言也可以。(如果其他语言可以解决我的问题,我可以将矩阵导出为csv、xlsx或txt,并使用其他语言。) 提前谢谢你 [更新] 如果 第1列|第2列|第3列 然后跑Python MatLab(或任何其他语言)转换矩阵或csv,以便在第一列值相同时将第二列值放入同一行?,python,matlab,matrix,Python,Matlab,Matrix,比如我有 第1列|第2列 我想把它转换成 第1列|第2列|第3列|第4列 (3,4)元素应为空 我可以通过Matlab使用for和if来实现,但是对于海量数据来说,这需要花费太多的时间,所以我需要一个更优雅、更出色的想法 我更喜欢Matlab,但其他语言也可以。(如果其他语言可以解决我的问题,我可以将矩阵导出为csv、xlsx或txt,并使用其他语言。) 提前谢谢你 [更新] 如果 第1列|第2列|第3列 然后跑 [U ix iu] = unique(A(:,1) ); r= accum
[U ix iu] = unique(A(:,1) ); r= accumarray( iu, A(:,2:3), [], @(x) {x'} )
请告诉我错误
Error using accumarray
Second input VAL must be a vector with one element for each row in SUBS, or a
scalar.
我想做些什么
第一栏|第二栏|第三栏|第四栏|第五栏|第六栏|第七栏
我该怎么做?提前谢谢你 使用带有自定义功能的
accumarray
>> r = accumarray( A(:,1), A(:,2), [], @(x) {x'} ); %//'
r =
[1x3 double]
[1x2 double]
>> r{1}
ans =
1 3 9
>> r{2}
ans =
4 7
更新:将单元格
r
转换为矩阵B
(在注释中容纳进一步请求):
你能详细说明一下转换之间的逻辑吗?您的输入只有一个
3
,而输出有两个。哪个元素应该在哪里结束?你能给我们看一下你当前的代码吗?我不确定您是否可以在Matlab中不使用for
循环就完成它,但我们可能能够帮助您改进现有的功能。@Schorsch Shai的可能复制迈出了一大步。但是我想把输出作为一个矩阵。如何将r{1}和r{2}合并到矩阵B中?我尝试了B=[r{1};r{2}],但失败了。也许将空单元格填充为其他单元格(如“5555555”)中极不可能存在的数字会起作用?然后在导出到xlsx后,我可以使用MS excel进行大规模替换。如何将这些空单元格填充为555,并使r{1},r{2}。。。作为一个大矩阵?可能与:+1重复:使用unique(A(:,1))
作为accumarray
的子矩阵可能更安全。如果列#1的值很大,则可能会得到不必要的大数组。非常感谢。但是如何将r{1}和r{2}合并到矩阵B中呢?我尝试了B=[r{1};r{2}],但失败了。我不明白它是什么意思。Shai的代码应该如何更改以适应您的建议?@user1849133B
第二行的第三个元素应该是什么?嗯,它应该是空的。或者至少在使用xlswrite或其他方法导出到csv或xlsx时,它应该为空。
2 3 234
2 44 33
2 12 22
3 123 99
3 1232 45
5 224 57
[U ix iu] = unique(A(:,1) ); r= accumarray( iu, A(:,2:3), [], @(x) {x'} )
Error using accumarray
Second input VAL must be a vector with one element for each row in SUBS, or a
scalar.
2 3 234 44 33 12 22
3 123 99 1232 45
5 224 57
>> r = accumarray( A(:,1), A(:,2), [], @(x) {x'} ); %//'
r =
[1x3 double]
[1x2 double]
>> r{1}
ans =
1 3 9
>> r{2}
ans =
4 7
>> [U ix iu] = unique( A(:,1) ); % see EitantT's comment
>> r = accumarray( iu, A(:,2), [], @(x) {x'} );
>> n = cellfun( @numel, r ); % fund num elements in each row - need for max
>> mx = max(n);
>> pad = 555555; % padding value
>> r = cellfun( @(x) [x pad*ones(1,mx - numel(x))], r, 'uni', 0 );
>> B = vertcat( r{:} ); % construct B from padded rows of r