1

我已经有一个维度为 d 的行向量 a,它只包含元素 0 或 1。

我想通过 d 矩阵 A 生成 ar,其中 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 中的非零元素。)

4

2 回答 2

2

如果您打算在 Python 中进行一般的矩阵乘法或数学运算,请使用NumPy

所有的行都A具有相同的值,因此计算它的有效方法是只构建一行。你已经有了那一行,a

NumPy 还可以广播数组的值,使一维向量的行为类似于具有重复值的二维数组。这是节省内存的,因为您不需要为重复值实际分配空间。

因此,在 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元素向量的 NumPy-talk——而不是一个形状数组,(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 回答