私は最近、次の派手な動作を回避する方法を考えていました。簡単な例から始めます。
import numpy as np
a = np.array([[1,2,3,4,5,6,7,8,9,0], [11, 12, 13, 14, 15, 16, 17, 18, 19, 10]])
それから:
b = a.copy()
b[:, [0,1,4,8]] = b[:, [0,1,4,8]] + 50
print(b)
...印刷結果:
[[51 52 3 4 55 6 7 8 59 0]
[61 62 13 14 65 16 17 18 69 10]]
しかし、1 つのインデックス double をスライスに取り込んでから、次のようにします。
c = a.copy()
c[:, [0,1,4,4,8]] = c[:, [0,1,4,4,8]] + 50
print(c)
与える:
[[51 52 3 4 55 6 7 8 59 0]
[61 62 13 14 65 16 17 18 69 10]]
(要するに、彼らは同じことをします)
また、インデックス 4 の場合は 2 回実行されますか? またはより実際的に; スライス要素 i を r 回与えるとします: numpy を 1 回だけ考慮するのではなく、上記の式を r 回適用できますか? また、「50」を i の出現ごとに異なるものに置き換えるとどうなりますか?
現在のコードでは、次を使用しました。
w[p1] = w[p1] + D[pix]
ここで、「pix」、「p1」を、dtype int、同じ長さ、およびいくつかの整数が複数回出現する可能性のあるnumpy配列として定義します。
(したがって、pix = [..., 1,1,1,2,2,3,...] と同時に p1 = [..., 21,32,13,23,11, 78、...]、しかし、したがって、インデックス 1 として最初の 1 と対応する 21 のみを取得し、残りのものをスクレイピングすることになります。)
もちろん、for ループを使用すると、問題は簡単に解決されます。ポイントは、配列の整数とサイズの両方が巨大であるため、効率的な numpy-array ルーチンの代わりに for ループを使用すると、多くの計算リソースが消費されることです。アイデア、既存のドキュメントへのリンクなどはありますか?