我已经有一个维度d的行向量a,它只包含元素0或1。
我想生成一个r乘以矩阵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乘n矩阵B,C = A * B将是r乘以n,其中C的行对应于向量a中的非零元素。 )
答案 0 :(得分:2)
如果您要在Python中进行矩阵乘法或数学运算,请使用NumPy。
A
的行都具有相同的值,因此高效计算它的方法是只构建一行。您已经拥有该行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,)
” - 这是n
元素的1D向量的NumPy-talk,而不是形状(r,n)
的数组因为,就像A
一样,所有行都具有相同的值。没有必要重复它们。
答案 1 :(得分: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.]])