【问题标题】:fastest way to create a nxn matrix with numpy containing zeros [duplicate]创建包含零的numpy的nxn矩阵的最快方法[重复]
【发布时间】:2019-05-10 07:17:37
【问题描述】:

简短的问题 - 这是在 python 和 numpy 中创建一个 16x16(或 nxn)矩阵的最快方法吗?

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

【问题讨论】:

  • 了解上下文会有所帮助。您是否正在创建多个矩阵?为什么你需要np.matrix 而不是np.ndarray
  • 我使用 np.matrix 因为我想将矩阵相乘.. 或者更好:向量有一个矩阵,例如:vT * M * v(它返回一个数字)我不知道,那个 np.矩阵很慢,几乎(?)已弃用

标签: python numpy matrix


【解决方案1】:

加快创建此矩阵的最佳方法是完全跳过使用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 has been deprecated:

注意 不再推荐使用这个类,即使是线性代数。而是使用常规数组。将来可能会删除该类。

编辑:在 cmets 中有一个很好的 discussion about the reasons behind matrix's deprecation 与 Paul Panzer 相关联。

人们使用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 = np.zeros((16, 16)) v = np.zeros((16)) print(a @ v) 返回列向量?我得到了一个 ROW 向量......
  • 是的,不幸的是,在 2D 矩阵和 1D 向量之间进行矩阵乘法时,Numpy 用于形状强制的规则有点令人困惑。 Numpy 在乘法运算期间会将一维 v 视为列向量,但仍会将结果作为普通一维数组返回。
  • 从技术上讲,Numpy 不会将一维数组视为行向量或列向量,而是会尝试根据上下文猜测它们是哪一个。请参阅matmul docsmatmul 用于实现@ 运算符的行为)了解完整的详细信息。
  • @Cyber​​bunny here 是一个很好的问答,关于矩阵类的优点与否。
【解决方案2】:

跳过matrix直接使用这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多