2017-10-20 14 views
0

私は単純な仕事を持っています: 私はイメージとポイントの配列を持っています。それぞれの点について、私はイメージからボックスをスライスしたい。スライスをブロードキャストしてイメージをスライスする方法は?エラー: '整数スカラ配列だけスカラーインデックスに変換することができます' Pythonで?

私はこれをforループで行うことができますが、何千もの点で非常に遅いので、ループなしでこれを行う必要があります。スライス値に配列をブロードキャストしようとしています。ここでは、問題を示しているいくつかの最小限のコードは次のとおりです。私はエラーになります

import numpy as np 
frame = cv2.imread("input.png") 
pts = np.array([[10,20], 
       [30,40], 
       [50,60]]) #and thousands more 
x1s = pts[:, 0] 
y1s = pts[:, 1] 
x2s = x1s + 5 
y2s = y1s + 5 
cutouts = frame[x1s:x2s,y1s:y2s] 

TypeError: only integer scalar arrays can be converted to a scalar index 

なぜ?スライスはすべて1次元の整数配列(スカラー)です。これはうまくいくはずです。何が間違っているのですか?それはどうすれば正しいのですか?

このエラーに関するその他のスタックオーバーフローフローの投稿は、スライシングやブロードキャストとは関係ありません。

編集:明確にするために、ポイント配列は数千ポイントになります。私は5x5スライスの配列を、各点ごとに1つずつ、必要とします。したがって、(10,20)で始まるスライス、(30,40)で始まるスライスなど

Edit2:2次元配列で放送することはできません。しかしこのは同じ概念です。どうして?

import numpy as np 
import cv2 
frame = np.arange(50).reshape(5,10) 
pts1 = np.array([1,2,3]) 
pts2 = np.array([4,5,6]) 
cutouts = frame[pts1,pts2] 
print cutouts 
#outputs [14 25 36] 
+0

「整数スカラー配列」は、配列1つの整数を含む0次元の配列である 'array(3)'のようなものです。それは整数スカラの任意の配列ではありません。 – user2357112

+0

編集2を参照してください。なぜ1つの例が機能し、もう1つがdoes notですか。 –

+0

アレイをスライスエンドポイントとして使用することはできません。 – user2357112

答えて

0

回答:できません。ナンシーはそれを許しません。

0

PTSの形状[:, 0]である(2)それはスカラー これを試していないので、それはあなたのケースで役立つはずです。

imgfrag = img[pts[0,0]:pts[1,0], pts[0,1]:pts[1,1]] 
+0

私はちょうど2つ以上のポイントに合ったソリューションを探しています。 私がpts [:、0]を印刷すると、スカラーの配列が次のようになります。 [10,30、値、値、値..] これはブロードキャストの基準を満たす必要があります。 –

+0

boradcastは、2 ndarrayで計算しようとすると意味がありません。あなたはインデックスとしてpts [:, 0]を使用しています。私はこれがボラードキャ​​ストのケースだとは思わない。 –

+0

edit2を参照してください –

関連する問題