私は単純な仕事を持っています: 私はイメージとポイントの配列を持っています。それぞれの点について、私はイメージからボックスをスライスしたい。スライスをブロードキャストしてイメージをスライスする方法は?エラー: '整数スカラ配列だけスカラーインデックスに変換することができます' 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]
「整数スカラー配列」は、配列1つの整数を含む0次元の配列である 'array(3)'のようなものです。それは整数スカラの任意の配列ではありません。 – user2357112
編集2を参照してください。なぜ1つの例が機能し、もう1つがdoes notですか。 –
アレイをスライスエンドポイントとして使用することはできません。 – user2357112