感谢您对 Python 3 的翻译帮助,该 Python 3 将任意大小的输入数组分解为长度为 4 的较小方形数组。
我已经在 numpy 中尝试过块和数组函数,但它们对此毫无用处。
这是我在 Perl 中运行良好的代码,但我希望它与 Python 进行比较(在效率上)。
sub make_array {
my $input = shift;
my $result;
my @parts = split '-', $input;
$result = [];
# Test for valid number of lines in inputs
my $lines = scalar @parts;
if($lines % $width){
die "Invalid line count $lines not divisible by $width" ;
# Or could pad here by adding an entire row of '0'.
}
# Chunk input lines into NxN subarrays
# loop across all input lines in steps of N lines
my $line_width = 0;
for (my $nn=0;$nn<$lines;$nn+=$width){
# make a temp array to handle $width rows of input
my @temp = (0..$width-1);
for my $ii (0..$width-1){
my $p = $parts[$nn+$ii];
my $padding_needed = length($p) % $width;
if($padding_needed != 0) {
print "'$p' is not divisible by correct width of $width, Adding $padding_needed zeros\n";
for my $pp (0..$padding_needed){
$p .= "0";
}
}
if($line_width == 0){
$line_width = length($p);
}
$temp[$ii] = $p;
}
# now process temp array left to right, creating keys
my $chunks = ($line_width/$width);
if($DEBUG) { print "chunks: $chunks\n"; }
for (my $zz =0;$zz<$chunks;$zz++){
if($DEBUG) { print "zz:$zz\n"; }
my $key;
for (my $yy=0;$yy<$width;$yy++){
my $qq = $temp[$yy];
$key .= substr($qq,$zz*$width, $width) . "-";
}
chop $key; # lose the trailing '-'
if($DEBUG) { print "Key: $key\n"; }
push @$result, $key;
}
}
if($DEBUG){
print "Reformatted input:";
print Dumper $result;
my $count = scalar @$result;
print "There are $count keys to check against the lookup table\n";
}
return $result;
}
例如,我有以下 12 x 12 矩阵:
000011110011
000011110011
000011110011
000011110011
000011110011
000011110011
000011110011
000011110011
我希望它分解成 6 个长度为 4 的方形子矩阵:
0000 1111 0011
0000 1111 0011
0000 1111 0011
0000 1111 0011
0000 1111 0011
0000 1111 0011
0000 1111 0011
0000 1111 0011
原始矩阵来自以下格式的文件(程序应从文本文件中读取):
000011110011,000011110011,000011110011,000011110011,000011110011,000011110011,000011110011,000011110011
所以程序需要用连字符分割它,并将每个块作为大矩阵的一行。这 6 个子矩阵应该采用相同的输入格式,因此第一个是:
0000,0000,0000,0000
程序应该将任何输入矩阵分解为长度为 j 的方阵,比如 4,如果原始矩阵的大小不是 4 的倍数,那么它应该忽略不能形成 4x4 矩阵的剩余块。
原始输入文件中可能会出现几个不同大小的大矩阵,并以断线作为分隔符。例如,原始大矩阵和另一个 rmatrix 在文本文件中看起来如下所示:
000011110011,000011110011,000011110011,000011110011,000011110011,000011110011,000011110011,000011110011\n
0101,0101,0101,0101
并检索 2 组子数组,6 个 4x4 数组中的一个,第二个 4x4 中的一个。如果你为单一情况解决它当然没问题。