大きな整数を処理するための数字の複数の配列

エズレル:

私は配列にそれぞれ番号を分割するので、私は、10000個の数字で、本当に大きな数字、整数を処理します。

小さなデータサンプル:

#all combinations with length 3 of values in list L
N = 3
L = [[1,9,0]]*N
a = np.array(np.meshgrid(*L)).T.reshape(-1,N)
#it is number so removed first 0 and also last value is always 0
a = a[(a[:, 0] != 0) & (a[:, -1] == 0)]
print (a)
[[1 1 0]
 [1 9 0]
 [1 0 0]
 [9 1 0]
 [9 9 0]
 [9 0 0]]

それから私は1.1スカラーすることにより、複数の番号が必要です。よりよく理解するために:

#joined arrays to numbers
b = np.array([int(''.join(x)) for x in a.astype(str)])[:, None]
print (b)
[[110]
 [190]
 [100]
 [910]
 [990]
 [900]]

#multiple by constant
c = b * 1.1
print (c)
[[ 121.]
 [ 209.]
 [ 110.]
 [1001.]
 [1089.]
 [ 990.]]

丸めので、しかし万桁ため、この解決策は、可能ではありません。私は、配列内の複数のソリューションを必要とするので:

私が試してみてください。合計最初に最後の0「列」が追加されましたと:

a1 = np.hstack((a[:, [-1]] , a[:, :-1] ))
print (a1)
[[0 1 1]
 [0 1 9]
 [0 1 0]
 [0 9 1]
 [0 9 9]
 [0 9 0]]

print (a1 + a)
[[ 1  2  1]
 [ 1 10  9]
 [ 1  1  0]
 [ 9 10  1]
 [ 9 18  9]
 [ 9  9  0]]

より多くのような値がある場合でも、問題がされ9、必要なシフト(古い学校の紙の加算など)次の桁があり、予想される出力は次のようになります。

c1 = np.array([list(str(x).split('.')[0].zfill(4)) for x in np.ravel(c)]).astype(int)
print (c1)
[[0 1 2 1]
 [0 2 0 9]
 [0 1 1 0]
 [1 0 0 1]
 [1 0 8 9]
 [0 9 9 0]]

生成するための可能ないくつかの高速ベクトル化されたソリューションですc1から、配列のa配列は?

オリジナル:

ここからベクトル化1つの作業ですaアイデアは、によって各列を乗算することで10**seqseq列の数、最大および降順にarangeあります。これは、として機能する連結私たちが取るたら列に沿っ桁のsum第2の軸に沿って。最後に、我々は同じロジックを適用するが、乗じた後の代わりに分割した形状にブロードキャストすることにより、プロセスを逆にすることができ1.1、かつ唯一の最後の桁を維持するために、結果の剰余10を取ります:

s = np.arange(a.shape[1]-1, -1, -1)
# concat digits along cols, and multiply
b = (a * 10**s).sum(1)*1.1
# highest amount of digits in b
n_cols = int(np.log10(b.max()))
# broadcast division to reverse
c = b[:, None] // 10**np.arange(n_cols, -1, -1)
# keep only last digit
c1 = (c%10).astype(int)

print(c1)

array([[0, 1, 2, 1],
       [0, 2, 0, 9],
       [0, 1, 1, 0],
       [1, 0, 0, 1],
       [1, 0, 8, 9],
       [0, 9, 9, 0]])

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=365022&siteId=1