-2

感谢您对 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 中的一个。如果你为单一情况解决它当然没问题。

4

1 回答 1

1

这很容易使用numpy。假设我们有一个 12x12 的数组;

In [1]: import numpy as np

In [2]: a = np.arange(144).reshape([-1,12])

In [3]: a
Out[3]: 
array([[  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11],
       [ 12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23],
       [ 24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35],
       [ 36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47],
       [ 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59],
       [ 60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71],
       [ 72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83],
       [ 84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95],
       [ 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107],
       [108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119],
       [120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131],
       [132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143]])

要选择左上角的 4x4 数组,请使用slicing

In [4]: a[0:4,0:4]
Out[4]: 
array([[ 0,  1,  2,  3],
       [12, 13, 14, 15],
       [24, 25, 26, 27],
       [36, 37, 38, 39]])

右下子数组是:

In [7]: a[8:12,8:12]
Out[7]: 
array([[104, 105, 106, 107],
       [116, 117, 118, 119],
       [128, 129, 130, 131],
       [140, 141, 142, 143]])

你可以猜到其余的...

于 2013-03-31T20:57:01.417 回答