2016-09-21 10 views
3

驚くべきことに、インターネット上で答えを見つけることができませんでした。私はn次元の配列があります。例:2-DのNP配列:希望の形状にするためのスライス数列

np.slice(MyArray, [6,4]) 

array([['34.5500000', '36.9000000', '37.3200000', '37.6700000'], 
     ['41.7900000', '44.8000000', '48.2600000', '46.1800000'], 
     ['36.1200000', '37.1500000', '39.3100000', '38.1000000'], 
     ['82.1000000', '82.0900000', '76.0200000', '77.7000000'], 
     ['48.0100000', '51.2500000', '51.1700000', '52.5000000', '55.2500000'], 
     ['39.7500000', '39.5000000', '36.8100000', '37.2500000']], dtype=object) 

あなたが見ることができるように、5行目では、このようなものを使用して、5 elemntsと私は第五消えるを作りたいから成り[6,4]は形です。私は本当に反復してディメンションをスローしてカットしたくありません。私はresizeメソッドを試しましたが、何も返しません!

+0

実際には、あなたの配列は、リストのちょうどベクトルです。 – wim

+0

@wimしかし、すべてのnp個のn次元配列は、ベクトルのベクトルです... n-1回....リストのそれはありませんか? –

+0

この配列の形状はどうですか? 'MyArray.shape'? – hpaulj

答えて

1

これは2次元配列ではありません。これは要素がオブジェクトである1次元配列です。この場合は4つの要素リストと1つの要素が1つです。このリストには文字列が含まれています。

In [585]: np.array(_) 
Out[585]: 
array([['34.5500000', '36.9000000', '37.3200000', '37.6700000'], 
     ['41.7900000', '44.8000000', '48.2600000', '46.1800000'], 
     ['36.1200000', '37.1500000', '39.3100000', '38.1000000'], 
     ['82.1000000', '82.0900000', '76.0200000', '77.7000000'], 
     ['48.0100000', '51.2500000', '51.1700000', '52.5000000'], 
     ['39.7500000', '39.5000000', '36.8100000', '37.2500000']], 
     dtype='<U10') 

slice

In [577]: np.array([['34.5500000', '36.9000000', '37.3200000', '37.6700000'], 
    ...:  ['41.7900000', '44.8000000', '48.2600000', '46.1800000'], 
    ...:  ['36.1200000', '37.1500000', '39.3100000', '38.1000000'], 
    ...:  ['82.1000000', '82.0900000', '76.0200000', '77.7000000'], 
    ...:  ['48.0100000', '51.2500000', '51.1700000', '52.5000000', '55.25 
    ...: 00000'], 
    ...:  ['39.7500000', '39.5000000', '36.8100000', '37.2500000']], dtyp 
    ...: e=object) 
Out[577]: 
array([['34.5500000', '36.9000000', '37.3200000', '37.6700000'], 
     ['41.7900000', '44.8000000', '48.2600000', '46.1800000'], 
     ['36.1200000', '37.1500000', '39.3100000', '38.1000000'], 
     ['82.1000000', '82.0900000', '76.0200000', '77.7000000'], 
     ['48.0100000', '51.2500000', '51.1700000', '52.5000000', '55.2500000'], 
     ['39.7500000', '39.5000000', '36.8100000', '37.2500000']], dtype=object) 
In [578]: MyArray=_ 
In [579]: MyArray.shape 
Out[579]: (6,) 
In [580]: MyArray[0] 
Out[580]: ['34.5500000', '36.9000000', '37.3200000', '37.6700000'] 
In [581]: MyArray[5] 
Out[581]: ['39.7500000', '39.5000000', '36.8100000', '37.2500000'] 
In [582]: MyArray[4] 
Out[582]: ['48.0100000', '51.2500000', '51.1700000', '52.5000000', '55.2500000'] 
In [583]: 

あなたはすべてのサブリストで今すぐ配列

In [584]: [d[:4] for d in MyArray] 
Out[584]: 
[['34.5500000', '36.9000000', '37.3200000', '37.6700000'], 
['41.7900000', '44.8000000', '48.2600000', '46.1800000'], 
['36.1200000', '37.1500000', '39.3100000', '38.1000000'], 
['82.1000000', '82.0900000', '76.0200000', '77.7000000'], 
['48.0100000', '51.2500000', '51.1700000', '52.5000000'], 
['39.7500000', '39.5000000', '36.8100000', '37.2500000']] 

の要素に同じ長さを反復処理する必要があり、これは、np.arrayは、2次元配列を作成します。しかし、まだストリングス

In [586]: np.array(__,dtype=float) 
Out[586]: 
array([[ 34.55, 36.9 , 37.32, 37.67], 
     [ 41.79, 44.8 , 48.26, 46.18], 
     [ 36.12, 37.15, 39.31, 38.1 ], 
     [ 82.1 , 82.09, 76.02, 77.7 ], 
     [ 48.01, 51.25, 51.17, 52.5 ], 
     [ 39.75, 39.5 , 36.81, 37.25]]) 
+0

それは私が見たいと思ったものではありませんが、それはいいです、ありがとう。 最後の出力は文字列ですか?この事実は、numpyの機能の使用を制限していますか? –

+0

最後の式は、floatの2次元配列を生成します。 – hpaulj

+0

申し訳ありませんが、私の悪い、あなたのコメントと前に混乱していた) –

0

はここでほとんど*ベクトル化されたアプローチだ -

def slice_2Dobject_arr(arr,out_shape): 
    lens = np.array(map(len,arr)) 
    id_arr = np.ones(lens.sum(),dtype=int) 
    id_arr[lens[:-1].cumsum()] = -lens[:-1]+1 
    mask = id_arr.cumsum()<=out_shape[1] 
    vals = np.concatenate(arr) 
    return vals[mask].reshape(-1,out_shape[1])[:out_shape[0]] 

*:ほとんどためと思われる入力配列にリストの長さを得るために開始時mapの使用のベクトル化操作ではありません。しかし、計算上、それは比較的無視できるものでなければならない。

サンプルの実行 -

In [92]: arr 
Out[92]: array([[3, 4, 5, 3], [3, 7, 8], [4, 9, 6, 4, 2], [3, 9, 4]], dtype=object) 

In [93]: slice_2Dobject_arr(arr,(4,3)) 
Out[93]: 
array([[3, 4, 5], 
     [3, 7, 8], 
     [4, 9, 6], 
     [3, 9, 4]]) 

In [94]: slice_2Dobject_arr(arr,(3,3)) 
Out[94]: 
array([[3, 4, 5], 
     [3, 7, 8], 
     [4, 9, 6]]) 

In [95]: slice_2Dobject_arr(arr,(3,2)) 
Out[95]: 
array([[3, 4], 
     [3, 7], 
     [4, 9]]) 
+0

それはクール、私は今それを試してみます。 previus答えにcmpared任意の恩恵はありますか? –

+1

@VladislavLadenkov他の答えは 'ループの理解 'を使っているようです。したがって、その入力配列に膨大な数のリストがある場合、パフォーマンス上の利点が見られるかもしれません。 – Divakar

+0

このソリューションは配列を平坦化し、マスクを使用して望ましくないものをスライスし、最後に再シェイプします。速度(可読性)が重要な場合は、現実的なサイズの配列で速度テストを行う必要があります。 – hpaulj

関連する問題