使用numpy创建一个包含零的nxn矩阵的最快方法

3

简短的问题 - 这是使用Python和NumPy创建一个16x16(或nxn)零矩阵的最快方法吗?

a = np.matrix(np.zeros((16, 16), dtype = np.int))

知道上下文会有所帮助。您是否正在创建多个矩阵?为什么需要使用 np.matrix 而不是 np.ndarray - hilberts_drinking_problem
我使用了np.matrix,因为我想要矩阵乘法。或者更好的说法是:向量与矩阵相乘,如: v.T * M * v(返回一个数字) 我不知道np.matrix很慢,而且几乎已经被弃用了。 - Cyberbunny
2个回答

3

加快创建此矩阵的最佳方法是完全跳过使用matrix类,而只使用np.zeros

a = np.zeros((16, 16))

跳过使用matrix可提高10倍速度:
%%timeit
a = np.matrix(np.zeros((16, 16)))
4.95 µs ± 50.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit
a = np.zeros((16, 16))
495 ns ± 2.18 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

numpy.matrix已被弃用:

注意 不再建议使用此类,即使是进行线性代数。而是使用常规数组。该类可能在将来被删除。

编辑:在评论中,Paul Panzer提供了有关matrix弃用原因的讨论

人们之所以使用matrix而不是array的常见原因是这样a * b会执行矩阵乘法(而不是像标准array那样成对乘法)。但是,您现在可以使用新的矩阵乘法运算符@来使用标准数组轻松执行矩阵乘法:

a = np.arange(2*2).reshape(2,2)
b = np.arange(2*2, 2*2*2).reshape(2,2)
print('a\n%s\n' % a)
print('b\n%s\n' % b)
print('a * b (pairwise multiplication)\n%s\n' % (a * b))
print('a @ b (matrix multiplication)\n%s\n' % (a @ b))

输出:

a
[[0 1]
 [2 3]]

b
[[4 5]
 [6 7]]

a * b (pairwise multiplication)
[[ 0  5]
 [12 21]]

a @ b (matrix multiplication)
[[ 6  7]
 [26 31]]

哇,我不知道这个(刚开始使用numpy)...我想使用矩阵的原因正如你所猜测的那样:进行矩阵乘法。它可以工作,但是a @ v不应该返回一个列向量吗?相反,我得到了一个行向量... - Cyberbunny
1
是的,不幸的是,当在两个二维矩阵和一维向量之间进行矩阵乘法时,Numpy使用的形状强制规则有点令人困惑。在乘法运算期间,Numpy将把一维向量“v”视为列向量,但仍将结果返回为普通的一维数组。 - tel
1
从技术上讲,Numpy不会将1D数组视为行向量或列向量,而是会根据上下文来猜测它们的类型。有关完整详细信息,请参见matmul文档matmul用于实现@运算符的行为)。 - tel
3
@Cyberbunny 这里有一个关于矩阵类优点与否的很好的问答。 - Paul Panzer
从线性代数的角度来看,有些情况下我希望表达式与线性代数完全匹配。当涉及到许多转置、内积、外积、雅可比矩阵等时,你所提倡的这种符号实在是太糟糕了。并不是所有的事情都只关乎性能。 - Ash

2
跳过 matrix 直接使用这个:
a = np.zeros((16, 16))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接