如何在python中有效地生成这个矩阵

时间:2013-05-23 14:05:28

标签: python numpy matrix

我已经有一个维度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中的非零元素。 )

2 个答案:

答案 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.]])