2017-04-25 3 views
0

私はnumpy.ndarrayを持っています。最初のh要素と最後のtを削除したいと思います。numpy配列から頭と尾を削除するPYTHON

h, t = 1, 1 
my_array = [0,1,2,3,4,5] 
middle = my_array[h:-t] 

と真ん中は[1,2,3,4]である:私は見ての通り

は、より一般的な方法は、選択することです。これは正しいですが、何も削除しない場合、何も削除しようとしていないので、h = 0とt = 0を使用しましたが、空の配列が返されます。私はそれがt = 0であることを知っています、そして、私はこの境界ケースのif条件がmy_array [h:]でそれを解決することを知っていますが、私はこの解決を望んでいません(私の問題は、 、コードが醜いになる)

アイデア?代わりに

答えて

1

、完全を期すため

middle = my_array[h:len(my_array)-t] 

を使用するには、ここでの試運転です:

my_array = [0,1,2,3,4,5] 
h,t = 0,0 
middle = my_array[h:len(my_array)-t] 
print(middle) 

Output: [0, 1, 2, 3, 4, 5] 

この例では、単に標準配列のためでした。あなたの究極の目標はnumpyの多次元配列で作業することなので、この問題は実際には少し難解です。最初のh要素と最後のt要素を削除したい場合は、htが適切な除算基準を満たし、結果が整形式配列になることが保証されますか?

実際には、このソリューションを使用するのが最もクリーンなソリューションだと思っていますが、最初に適切な要因で除算してください。例えば、二次元で:

h = 3 
t = 6 
a = numpy.array([[ 1, 2, 3], 
     [ 4, 5, 6], 
     [ 7, 8, 9], 
     [10, 11, 12]]) 

d = numpy.prod(numpy.shape(a)[1:]) 
mid_a = a[int(h/3):int(len(a)-t/3)] 
print(mid_a) 

Output: array([[4, 5, 6]]) 

Iは、Python 3が自動的に分子が均等分母を分割した場合でも、浮動する分裂を促進するためINTがインデックスにキャスト含まれています。

+1

多次元配列を扱う際には注意が必要です。私は 'len(my_array)の代わりに' my_array.size'を使うことをお勧めします。 – kmario23

+0

良いことに、私はそれをテストし、私の答えを編集します。ありがとうございました。 – Apollys

1

i:jは、sliceオブジェクトで置き換えることができます。そしてslice(None,j)':j'など:

In [55]: alist = [0,1,2,3,4,5] 
In [56]: h,t=1,-1; alist[slice(h,t)] 
Out[56]: [1, 2, 3, 4] 
In [57]: h,t=None,-1; alist[slice(h,t)] 
Out[57]: [0, 1, 2, 3, 4] 
In [58]: h,t=None,None; alist[slice(h,t)] 
Out[58]: [0, 1, 2, 3, 4, 5] 

これは、リストと配列のために動作します。多次元配列の場合、スライスオブジェクトを含めることができるインデックスのタプルを使用します。

x[i:j, k:l] 
x[(slice(i,j), Ellipsis, slice(k,l))] 
関連する問題