1

要素 0 または 1 のみを含む次元 d の行ベクトル a が既にあります。

ar を d 行列 A で生成したいのですが、ここで A は次を満たします。

for column j = 1,2 .... d
if a[j] = 1, then A[:,j] = 1. That's, the corresponding column will be all 1's 
if a[j] = 0, then A[:,j] = 0. ....

私はそれが非常に簡単に見えると思います。しかし、Python(または他の言語)で効率的に生成する方法がわかりません。

r = 1,000 および d = 100,000 であることに注意してください。

(この行列 A を生成したい理由は、別の d x n 行列 B が与えられると、C = A*B が r x n になり、C の行がベクトル a の非ゼロ要素に対応するためです。)

4

2 に答える 2

2

Python で行列の乗算や一般的な数学を行う場合は、NumPyを使用します。

Aすべての行は同じ値を持つため、それを計算する効率的な方法は、1 つの行だけを作成することです。すでにその行がありaます。

NumPy は、配列の値をブロードキャストすることもできます。これにより、1 次元のベクトルが、値が繰り返される 2 次元の配列のように機能します。これは、繰り返される値に実際にスペースを割り当てる必要がないため、メモリ効率が高くなります。

したがって、NumPy では次のような計算を実行できます。

import numpy as np

r, d, n = 1000, 100000, 1000
a = np.random.randint(2, size=d)
A = a
print(A.shape)
# (100000,)

B = np.random.random((d, n))
print(B.shape)
# (100000, 1000)

C = A.dot(B)
print(C.shape)
# (1000,)    

結果Cは " of shape (n,)" です -- これは要素の 1D ベクトルの NumPy-talk です-- のように、すべての行が同じ値を持つため、n形状の配列ではありません。それらを繰り返す必要はありません。(r,n)A

于 2013-05-23T14:56:32.010 に答える
1
>>> import numpy as np
>>> r, d = 1000, 100000
>>> a = np.random.rand(d).round()
>>> A = a * np.ones((r, 1))
>>> A.shape
(1000, 100000)
>>> a
array([ 1.,  0.,  1., ...,  1.,  0.,  1.])
>>> A
array([[ 1.,  0.,  1., ...,  1.,  0.,  1.],
       [ 1.,  0.,  1., ...,  1.,  0.,  1.],
       [ 1.,  0.,  1., ...,  1.,  0.,  1.],
       ..., 
       [ 1.,  0.,  1., ...,  1.,  0.,  1.],
       [ 1.,  0.,  1., ...,  1.,  0.,  1.],
       [ 1.,  0.,  1., ...,  1.,  0.,  1.]])
于 2013-05-23T14:27:34.353 に答える