2017-09-27 5 views
0

私はPython上でスクリプトを学習する自分のマシンを作成しようとしています(私はそこにライブラリがあることを知っていますが、これは純粋にそれを楽しむためのものです。 Pythonを学ぶ)。私は以下の配列を持っています。Pythonで配列の配列をスライスする方法

[array([[[ 5, 5, 5, 255], 
    [ 6, 6, 6, 255], 
    [ 6, 6, 6, 255], 
    ..., 
    [ 12, 12, 12, 255], 
    [ 10, 10, 10, 255], 
    [ 10, 10, 10, 255]], 

    [[ 8, 8, 8, 255], 
    [ 10, 10, 10, 255], 
    [ 14, 14, 14, 255], 
    ..., 
    [ 15, 15, 15, 255], 
    [ 13, 13, 13, 255], 
    [ 13, 13, 13, 255]], 

これはしばらくの間続きます。私は、次のコードを使用して、この配列を持っている:

imagesList = listdir("someaddress") 
loadedImages = [] 
for image in imagesList: 
    #img = PImage.open() 
    loadedImages.append(misc.imread("someaddress" + image)) 

ここに私のロジックは、私は画像の分類問題で使用するための画素値の配列として画像ファイルに読んでもらいたいです。上記のデータから分かるように、画像はグレースケールです。私はこのデータから次元を削除したいと思いますし、各ピクセル(例:([[5]、[6]、[6]、[12] ...)の単一の値を持っています。アルファ値(私は気にしません)。私はこれが私が使用する必要がある配列スプライシングだと知っていますが、少年はこの問題にどのように適用するか分かりません。

私は試しました loadedImages [:1]

を私は次のエラーを取得する。

を次のように私は本当にこのうちたい

TypeError: list indices must be integers, not tuple 

結果が見えます

+0

インデックスにコンマを入れたのはなぜですか?さらに、[この質問](https://stackoverflow.com/questions/509211/explain-slice-notation)が役立ちます。 – Jerrybibo

+0

@Jerrybiboもし私が正直であれば、私はたくさんのSOの質問を閲覧しました。私はこれで海で少しです! – user6916458

+0

また、 'splicing'ではなく配列' slicing'です。 – acushner

答えて

1

loadingimages [:1]のように、スプライスのコンマを削除しようとしましたか?この配列arr = [ 5, 5, 5, 255]の場合、255を削除するにはarr = arr[:3]を実行します。多次元配列の場合は、必要に応じてforループをネストして、個々の配列を繰り返し処理することができます。例えば

main_array = [[ 5, 5, 5, 255], 
       [ 6, 6, 6, 255], 
       [ 6, 6, 6, 255]] 

for sub_array in main_array: 
    spliced_array = sub_array[:3] 
    print spliced_array 

はPythonで、データ構造のこの種のリストと呼ばれ、また

[5, 5, 5] 
[6, 6, 6] 
[6, 6, 6] 

得られます。それはあなたがそれについての情報を見つけるのに苦労している理由です。

編集:リスト内包表記を使用することもできます。これはPythonで本当に役に立つものです。例えば

arr = [[ 5, 5, 5, 255], 
     [ 6, 6, 6, 255], 
     [ 6, 6, 6, 255]] 

filtered_arr = [a[0] for a in arr] 
filtered_arr 
>>>[5,6,6] 
+0

ねえ、入力いただきありがとうございます。私が本当に欲しいのは、各行に1つの数字(例えば、5 ... 6 ... 6 ...)を3回すべて持っている必要はありません! – user6916458

+0

これが当てはまる場合は、arr [:1]または単にarr [0]を実行できます。リストの最初の要素が取得されます。私が与えた例では、同じロジックを使用してください。 – jabargas

+0

ありがとうございます。これをどのようにして同じフォーマットの配列に戻すのですか?私はまだ配列が番号の代わりに最も内側の配列を持つ同じ形式のものであることを望んでいます。 – user6916458

1

だけでnumpyのを使用して、あなたがやりたいの拡張スライスの種類行うことができます。この例では

import numpy as np 
a = np.array([[ 5, 5, 5, 255], 
[ 6, 6, 6, 255], 
[ 6, 6, 6, 255]]) 
# first column: 
print(a[:, 0]) 

を、:は、アレイのすべての行を表し、0は、最初の列を表し、

+0

最初に余分な角括弧が1つあります。どのように*スライス*の構文が変更されますか? :) – user6916458

+0

フェアな質問です。基本的には、順序は外側から内側に行くので、最初の列を取得するには、質問に記載されているエラーを返す 'a [:,:、0]' – acushner

+0

@acuchnerを実行するといいでしょう(TypeError:リストのインデックスは必須ですタプルではなく整数である) – user6916458

関連する問題