2017-05-17 10 views
0

私はこれを自分で実装しようとすると多くの問題を抱えています。だれかが指し示すことができる、またはアルゴリズムを記述することができれば、大いに義務づけられます。一次元この{1,2,3,4}ようになり、ポインタint* iを平らにし、リスト{2,2}の形でディメンションのリストを与えられた指定された寸法と一致する1次元配列の形を変える考えるCで配列を1DからNDに変更する

問題文の

。プロシージャの後では全体的に配列は{{1,2},{3,4}}のようになります。

numpy.reshapeで使用されているアルゴリズムを誰かが知っているかどうかは基本的に尋ねています。

+2

何がNumPyのソースコードを調べるのを止めますか? – ForceBru

+0

私はそれがオープンソースであることを知らなかったという事実(それでもまだありません)。 –

答えて

3

のn次元配列は、単純な配列内のオフセットを計算するための構文的な砂糖に過ぎず、メモリ内で同じように見えます(1つの連続ブロック)。そのため、 "再形成" にはポイントが本当にありません、それはこの小さなサンプルでは示してい、と:

#include <stdio.h> 

int data[] = {1,2,3,4}; 

int main(void) 
{ 
    int *i = data; 

    for (int n = 0; n < 4; ++n) 
    { 
     printf("i[%d] = %d\n", n, i[n]); 
    } 

    int (*j)[2] = (void *)i; 

    for (int n1 = 0; n1 < 2; ++n1) 
    { 
     for (int n2 = 0; n2 < 2; ++n2) 
     { 
      printf("j[%d][%d] = %d\n", n1, n2, j[n1][n2]); 
     } 
    } 

    return 0; 
} 

出力:

I [0] = 1
I [1] = 2
I [2] = 3
I [3] = 4
J [0] [0] = 1
J [0] [1] = 2
J [1] [0] = 3
jは[ 1] [1] = 4

+0

ええ、これは単純な反復解法ですが、次元数には限界がありません。それを999次元に再構成するには、正確に999回のループが必要です。 –

+1

@VahagnTumanyanループは、 '* int [2]'ポインタによるアクセスが期待通りに機能することを "実証しています"。実際には「再形成」は起こりません。別のタイプのポインタをエイリアシングするだけです。 –

+0

@VahagnTumanyan 999のディメンションに2つのボトム要素がある場合でも、全体のサイズは(2^999)* sizeof(要素)になります。冗談ですか? – BLUEPIXY

0

NumPyは、形状に関係なくデータを連続して保存するため、アルゴリズムは必要ありません。 「形状」プロパティは、入力と出力の間の唯一の違いです(reshape())。アルゴリズムは、後でアレイにアクセスするとき(例えば、印刷時など)に有効になります。次に、各行や他の次元にいくつの要素が含まれているかを知るために、形状に従う必要があります。

関連する問題