web-dev-qa-db-ja.com

numpy array TypeError:整数スカラー配列のみがスカラーインデックスに変換できます

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:整数スカラー配列のみがスカラーインデックスに変換できます。

41
kinder chen

簡潔な答え:

[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ループです。

21
Maxim

以下を試して、配列を1Dに変更してください

a.reshape((1, -1))
10
WIND.Knight

これはこの特定の問題とは無関係かもしれませんが、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]
6
Zhanwen Chen

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])
4
Andre Araujo

私は同様の問題を抱えていて、リストを使用して解決しました...これが役立つかどうかわからない

classes = list(unique_labels(y_true, y_pred))
2
ShadyMBA

この問題は、forループなどでスカラーの代わりにベクトルを使用する場合に発生します。その場所でベクトルを指定した場合、エラーが発生します。したがって、問題を回避するには、使用したベクトルの長さを使用してください

0
Athil Althaf