i=np.arange(1,4,dtype=np.int)
a=np.arange(9).reshape(3,3)
そして
a
>>>array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
a[:,0:1]
>>>array([[0],
[3],
[6]])
a[:,0:2]
>>>array([[0, 1],
[3, 4],
[6, 7]])
a[:,0:3]
>>>array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
次に、配列をベクトル化して、それらをすべて一緒に印刷します。やってみる
a[:,0:i]
または
a[:,0:i[:,None]]
TypeError:整数スカラー配列のみがスカラーインデックスに変換できます。
簡潔な答え:
[a[:,:j] for j in i]
あなたがやろうとしているのはベクトル化可能な操作ではないです。 ウィキペディアで定義 個々のスカラーではなく、単一の配列でのバッチ操作としてのベクトル化:
コンピューターサイエンスでは、配列プログラミング言語(ベクトルまたは多次元言語とも呼ばれます)がスカラーの操作を一般化して、ベクトル、行列、および高次元配列に透過的に適用します。
...
...配列全体を操作する操作は、vectorized操作と呼ぶことができます...
CPUレベルの最適化に関して、 ベクトル化の定義 は次のとおりです。
「ベクトル化」(簡略化)は、ループの書き換えプロセスで、配列の1つの要素をN回処理する代わりに、配列の4つの要素をN/4回同時に処理します。
あなたの場合の問題は、個々の操作の結果が異なる形状を持つことです:(3, 1)
、(3, 2)
、および(3, 3)
。出力は1つの連続した配列でなければならないため、単一のベクトル化された操作の出力を形成できません。もちろん、その中に(3, 1)
、(3, 2)
および(3, 3)
配列を(ビューとして)含めることができますが、それは元の配列a
がすでにしていることです。
本当に探しているのは、それらすべてを計算する単一の式です。
[a[:,:j] for j in i]
...しかし、パフォーマンスの最適化という意味ではベクトル化されていません。内部では、各アイテムを1つずつ計算する単純な古いfor
ループです。
以下を試して、配列を1Dに変更してください
a.reshape((1, -1))
これはこの特定の問題とは無関係かもしれませんが、PythonリストでNumPyインデックスを使用して、まったく同じエラーメッセージが表示される同様の問題に遭遇しました。
# incorrect
weights = list(range(1, 129)) + list(range(128, 0, -1))
mapped_image = weights[image[:, :, band]] # image.shape = [800, 600, 3]
# TypeError: only integer scalar arrays can be converted to a scalar index
多次元のNumPyインデックスを適用する前に、1D Pythonリストであるweights
をNumPy配列に変換する必要がありました。以下のコードが機能します:
# correct
weights = np.array(list(range(1, 129)) + list(range(128, 0, -1)))
mapped_image = weights[image[:, :, band]] # image.shape = [800, 600, 3]
Numpy.ravelを使用して、n次元配列から平坦化された配列を返すことができます。
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> a.ravel()
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
私は同様の問題を抱えていて、リストを使用して解決しました...これが役立つかどうかわからない
classes = list(unique_labels(y_true, y_pred))
この問題は、forループなどでスカラーの代わりにベクトルを使用する場合に発生します。その場所でベクトルを指定した場合、エラーが発生します。したがって、問題を回避するには、使用したベクトルの長さを使用してください