小编Bab*_*bak的帖子

使用 Cholesky 分解在 numpy 中反转矩阵的效率

我有一个对称正定矩阵(例如协方差矩阵),我想计算它的逆矩阵。在数学中,我知道使用 Cholesky 分解来反转矩阵会更有效,特别是当你的矩阵很大时。但我不确定“numpy.lianlg.inv()”是如何工作的。假设我有以下代码:

import numpy as np

X = np.arange(10000).reshape(100,100)
X = X + X.T - np.diag(X.diagonal()) #  symmetry 
X = np.dot(X,X.T) # positive-definite

# simple inversion:
inverse1 = np.linalg.inv(X) 

# Cholesky decomposition inversion:
c = np.linalg.inv(np.linalg.cholesky(X))
inverse2 = np.dot(c.T,c)
Run Code Online (Sandbox Code Playgroud)

哪一个更有效(inverse1 或 inverse2)?如果第二个更有效,为什么 numpy.linalg.inv() 不使用它呢?

python performance numpy matrix matrix-inverse

6
推荐指数
1
解决办法
8638
查看次数

NumPy数组索引4D数组

我有一个4D数组'a'大小(2,3,4,4)填充零.

import numpy as np
a = np.zeros((2,3,4,4))
Run Code Online (Sandbox Code Playgroud)

我还有一个大小为(2,3,4)的3D数组'b',它带有一些索引值(全部在0到3之间).

我想要做的是将'a'中的每个最后一个数组的元素('a'的第四个维度)替换为'b'中的索引,使用1.

我可以使用3 for循环执行此操作,如下所示:

for i in a.shape[0]:
    for j in a.shape[1]:
        for z in a.shape[2]:
            a[i,j,z][b[i,j,z]] = 1 
Run Code Online (Sandbox Code Playgroud)

但我想知道无论如何我都可以避免循环.类似的东西:

a[b] = 1
Run Code Online (Sandbox Code Playgroud)

python arrays numpy vectorization

5
推荐指数
1
解决办法
1万
查看次数

在最后2个维度中旋转5D阵列

我有一个5D数组'a',大小(3,2,2,2,2).

import numpy as np
a = np.arange(48).reshape(3,2,2,2,2)
a[0,0,0]:
array([[0, 1],
       [2, 3]])
Run Code Online (Sandbox Code Playgroud)

我想要做的是将这个5D阵列旋转180度,但仅在最后两个维度中,不改变它们的位置.所以输出[0,0,0]应如下所示:

out[0,0,0]:
array([[3, 2],
       [1, 0]])
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

out = np.rot90(a, 2)
out[0,0,0]:
array([[40, 41],
       [42, 43]])
Run Code Online (Sandbox Code Playgroud)

rot90功能显然可以旋转整个阵列.

注意:如果可能,我想避免使用for循环

python arrays numpy rotation vectorization

5
推荐指数
1
解决办法
413
查看次数

左联想与左递归

我正在尝试为C编写一个编译器(虽然简单的语法).

有些事情我已经坚持了一段时间.如果我没有正确理解,所有二进制操作都是关联的.因此,如果我们有"x + y + z",则首先出现x + y,然后出现加号z.

但是,不执行左关联会导致无限左递归吗?

到目前为止,我检查过的所有解决方案都是左关联的,或者没有左递归,但不是两者都有.是否可以使用具有这两种属性的语法.它甚至可能吗?

例:

左联想:

Expr = Term | Expr + Term
Term = Element | Term ? Element
Element = x|y|z|(Expr)
Run Code Online (Sandbox Code Playgroud)

左递归消除:

Expr = Term ExprTail
ExprTail = epsilon | + Term ExprTail

Term = Element TermTail
TermTail = epsilon | * Element TermTail

Element = x|y|z|(Expr)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

compiler-construction grammar parsing left-recursion

4
推荐指数
1
解决办法
1744
查看次数

在 LLVM 中查找指令的后继列表

我想获取 llvm 中每条指令的后继者列表。如果我理解正确的话,对于除分支 (br) 之外的所有指令,后继指令是下一条指令。但对于分支指令来说有点棘手。

例如,如果我有以下 C 代码:

int main() {
  int a = 7;
  int b = a * 2;

  int x;
  if (a < 3) {
    x = 10 + b;
  } else {
    x = 20 + a;
  }
  return b;
Run Code Online (Sandbox Code Playgroud)

}

我得到以下字节码:

define i32 @main() #0 {
%1 = mul nsw i32 7, 2
%2 = icmp slt i32 7, 3
br i1 %2, label %3, label %5

; <label>:3:                                      ; preds = %0
%4 = …
Run Code Online (Sandbox Code Playgroud)

llvm

3
推荐指数
1
解决办法
2660
查看次数