0

私がやりたいのは、次のようなnumpy配列を取得することです。

[[1, 2,  4, 7,  9, 15,  0],
 [3, 4,  3, 5, 10,  2, -2],
 [5, 6, 56, 7, 20,  1,  2]]

各行の最後の列を取得し、それを前の行の4番目の列で除算し、結果を取得して、新しい次元として配列に追加します。必要な出力は次のようになります。

[[1, 2,  4, 7,  9, 15,  0,  0],
 [3, 4,  3, 5, 10,  2, -2, -.2857],
 [5, 6, 56, 7, 20,  1,  2, .4]]

これはforループなしで実行できますか?(forループなしでこれを行うのは効率的ではないと思います)しかし、私はまだ1つでそれを行う方法がわかりません

4

4 に答える 4

2
import numpy as np
myarray = np.array([[1,2,4,7,9,15,0.0], [3, 4,3,5,10,2,-2], [5,6,56,7,20,1,2]])
#the division:
column_divs = myarray[:,-1][1:] / myarray[:,3][:-1]
#adds a 'placeholder' zero value, as the first element:
column_divs = np.hstack(([0], column_divs))
#adds the required column to the end of the array:
print np.hstack((myarray, column_divs.reshape(-1,1)))
#output:
[[  1.      2.       4.       7.       9.      15.      0.       0.        ]
 [  3.      4.       3.       5.      10.       2.     -2.      -0.28571429]
 [  5.      6.      56.       7.      20.       1.      2.      0.4        ]]
于 2012-07-02T16:49:42.347 に答える
1

np.concatenateを使用することをお勧めします:

np.concatenate((a, np.concatenate(([[0]], a[1:, [-1]] / a[:-1, [3]].astype(float)))), axis=1)

astype(float)配列にintdtypeがある場合、Python2.xにはが必要です。

これは、とで書くこともできhstackますvstack

np.hstack((a, np.vstack(([[0]], a[1:, [-1]] / a[:-1, [3]].astype(float)))))

行をスライスする代わりに、次を使用しても問題ない場合がありますroll

np.hstack((a, np.vstack((a[:, [-1]] / np.roll(a[:, [3]], 1).astype(float)))))
于 2012-07-02T16:43:20.697 に答える
1
import numpy as np
lis=[[1, 2,  4, 7,  9, 15,  0],
 [3, 4,  3, 5, 10,  2, -2],
 [5, 6, 56, 7, 20,  1,  2]]
new_lis=[lis[i][:]+[lis[i][-1]/lis[i][3]] for i in range(len(lis))]
nparray=np.matrix(new_lis)
于 2012-07-02T16:40:32.937 に答える
0

回答がないことを事前にお詫びしますが、パフォーマンスよりもアルゴリズムの純度を優先している場合を除き、for ループまたは同様の構造でこれを行う必要があります。

これを純粋に行列演算 (カスタム カーネルでオリジナルを乗算し、結果を元の行列の新しい列として連結する) で達成する方法はおそらくありますが、それほど効率的ではありません。Strassen のアルゴリズム (2 つの正方行列の効率的な乗算の例) がO(n^log7)、または ~O(n^2.807)nあると考えてください。ここで、 は乗算される行列の要素数のサイズです。for ループは になりますO(m)。ここmで、 は問題の行列の行数です。

于 2012-07-02T16:39:25.403 に答える