- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的问题是关于下面最后一行:mu@sigma@mu
。为什么有效?一维nDarray被视为行向量还是列向量?不管怎样,不是应该是mu.T@sigma@mu
还是mu@sigma@mu.T
?我知道mu.T
仍然返回mu
,因为mu
只有一个维度,但是解释器似乎还是太聪明了。
>> import numpy as np
>> mu = np.array([1, 1])
>> print(mu)
[1 1]
>> sigma = np.eye(2) * 3
>> print(sigma)
[[ 3. 0.]
[ 0. 3.]]
>> mu@sigma@mu
6.0
@
来执行上面的矩阵乘法(更干净的代码),或者使用
np.matrix
和下面的重载
*
(数学上不那么混乱)
>> import numpy as np
>> mu = np.matrix(np.array([1, 1]))
>> print(mu)
[[1 1]]
>> sigma = np.matrix(np.eye(2) * 3)
>> print(sigma)
[[ 3. 0.]
[ 0. 3.]]
>> a = mu * sigma * mu.T
>> a.item((0, 0))
6.0
最佳答案
python执行从左到右的链接操作:
In [32]: mu=np.array([1,1])
In [33]: sigma= np.array([[3,0],[0,3]])
In [34]: mu@sigma@mu
Out[34]: 6
In [35]: temp=mu@sigma
In [36]: temp.shape
Out[36]: (2,)
In [37]: temp@mu
Out[37]: 6
@
只是在做
np.dot
。那不太对。文档以不同的方式描述1d数组的处理。但最终的形状是一样的:
In [38]: mu.dot(sigma).dot(mu)
Out[38]: 6
In [39]: mu.dot(sigma).shape
Out[39]: (2,)
np.dot
和
@
应该产生相同的结果它们在处理高维数组方面有所不同。
np.dot
是最初的矩阵乘法方法/函数。
np.matrix
被添加,主要是为了方便任性的MATLAB程序员它只允许二维数组(就像旧的,90年代的MATLAB一样)它超载
__mat__
(*)
def __mul__(self, other):
if isinstance(other, (N.ndarray, list, tuple)) :
# This promotes 1-D vectors to row vectors
return N.dot(self, asmatrix(other))
if isscalar(other) or not hasattr(other, '__rmul__') :
return N.dot(self, other)
return NotImplemented
Mu*sigma
和
Mu@sigma
的行为相同,尽管调用树不同
In [48]: Mu@sigma@Mu
...
ValueError: shapes (1,2) and (1,2) not aligned: 2 (dim 1) != 1 (dim 0)
Mu*sigma
产生(1,2)矩阵,该矩阵不能与(1,2)相乘,因此需要转置:
In [49]: Mu@sigma@Mu.T
Out[49]: matrix([[6]])
item
。(在Matlab中没有标量这样的东西。所有东西都有形状/大小。)
@
是python和numpy的一个相对较新的添加。它是作为一个未实现的操作符添加到python中的。numpy(可能还有其他包)已经实现了它。
dot
中的链式
[38]
没有任何问题。它在处理高维情况时更有用。
np.matrix
类的理由更少了。(类似矩阵的行为在
scipy.sparse
矩阵类中根深蒂固。)
np.einsum
中所实现的。
In [57]: timeit mu.dot(sigma).dot(mu)
2.79 µs ± 7.75 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [58]: timeit mu@sigma@mu
6.29 µs ± 31.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [59]: timeit Mu@sigma@Mu.T
17.1 µs ± 134 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [60]: timeit Mu*sigma*Mu.T
17.7 µs ± 517 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
dot
是最快的,而两个矩阵版本都比较慢。
mu@sigma@mu.T
的表达式中,首先计算
.T
,因此
@
(
matmul
)不知道有人试图转置
mu
。它只是使用转置的结果。记住,解析表达式的是python解释器,而不是
numpy
函数。因此,如果
mu.T
对
mu
没有任何作用,就像一维数组一样,
.T
也不会对
@
产生影响。
transpose
对于二维数组定义良好。
numpy
转置是以这样的方式编写的,它也可以用于任何维度的数组它改变轴的顺序,但从不添加维度还有其他的工具,比如
reshape
和
np.newaxis
索引。
>> ones(2,3,4)'
error: transpose not defined for N-d objects
In [270]: np.ones((2,3,4),int).T.shape
Out[270]: (4, 3, 2)
np.dot
非常明确地说明了它如何处理1d数组,“向量”:
a
和
b
都是一维数组,则它是向量的内积。
matmul
中,描述更加复杂,但结果相同。
numpy
中使用产品的各种方法有:
In [273]: A = np.array([1,2]); B = np.array([3,5])
.*
)
In [274]: A*B
Out[274]: array([ 3, 10])
In [275]: A@B # same as np.dot(A,B)
Out[275]: 13
In [276]: np.outer(A,B)
Out[276]:
array([[ 3, 5],
[ 6, 10]])
In [278]: np.sum(A*B)
Out[278]: 13
In [280]: np.einsum('i,i',A,B)
Out[280]: array(13)
In [281]: np.einsum('i,j',A,B)
Out[281]:
array([[ 3, 5],
[ 6, 10]])
In [282]: A[:,None]*B[None,:]
Out[282]:
array([[ 3, 5],
[ 6, 10]])
[1, 2]'
在
numpy
中实现为
A[:,None]
,将1d数组转换为列向量(2d)。
numpy
之后很长一段时间增加了广播我不知道MATLAB有没有那么先进:)
@
不进行广播,但可以使用列向量或行向量:
In [283]: A@B[:,None] # your imagined A*B'
Out[283]: array([13])
@
获取外部,我需要添加一个维度,使
A
成为列向量,并使
B
成为行向量:
In [284]: A[:,None]@B
ValueError: shapes (2,1) and (2,) not aligned: 1 (dim 1) != 2 (dim 0)
In [285]: A[:,None]@B[None,:]
Out[285]:
array([[ 3, 5],
[ 6, 10]])
@
/
dot
的行为与常见的矩阵约定没有太大区别当维数为1或大于2时,来自MATLAB的直觉就失败了,部分原因是MATLAB不能处理这些问题。
>> ones(2,3,4) * ones(2,3,4)
error: operator *: nonconformant arguments (op1 is 2x12, op2 is 2x12)
关于python - numpy矩阵代数最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48492429/
我已经将一些变量声明为 bool 值,我希望 C++ 在我进行一些 bool 加法时知道该做什么,但它并没有按照我希望的方式发生。我如何让它工作。 #include using namespace s
我正在创建小型配置文件查看器,我想在 SQL 中模拟环。怎么运行的?对于简单:我的 table 上有 5 个用户。当我从中间获得一个到我的实验(如用户编号 2、3、4)时,下一个和上一个用户是 CUR
我计划使用低级 API 实现 FUSE 文件系统,目前正在尝试了解 fuse_entry_param结构体。 不知道是什么unsigned long fuse_entry_param::generat
从事 JS 工作,刚刚开始学习 boolean 代数。想知道是否有办法简化这个表达式: (!variableOne || !variableTwo) 我记得听说过两个“not”意味着你可以改变符号,但
我有这个 F-代数 (introduced in a previous question),我想在它上面施放一个有效的代数。通过绝望的试验,我设法组合了一个有效的 monadic catamorphi
我在 Google 上到处寻找德摩根定律的 bool 代数(不是集合论)证明,但找不到。 Stack Overflow 也缺少 DeMorgan 定律问题。 作为我的 CIS 251 类(class)
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
正在解决这个问题。 验证闰年的基本规则如下: - 大多数能被4整除的年份都是闰年。 - 异常(exception):世纪年不是闰年,除非它们可以被 400 整除。 这就是答案: if(y%4==0 &
假设算法的最坏情况运行时间可以描述为: T(n) = O(n) + O(r^2) + O(n-r) n 是输入大小,r 是根据算法创建分区的索引。 这个等式可以进一步简化吗?如果变量都是 n 那么它将
有没有办法在 JS 中使用 bool 代数? 例如,我想遍历一个包含 true 和 false 的数组,并将其简化为只有 true 或 false。 用 bool 代数来做这件事似乎是一种优雅的方式.
假设我有两个数据框 df1 df2 我可以加入 df1_keys 和 df2_keys。 我想做的事: (A-B) (A-B) U (B-A) A=df1 和 B=df2。 根据我在 document
这个问题已经有答案了: How can I remove a flag in C? (3 个回答) How to set, clear, and toggle a single bit? (27 个回
大家 我实现了自定义聚合 pig UDF。UDF 实现了 Algebraic 接口(interface),并且有 3 个类 - Initial、Intermed 和 Final 在不同阶段进行工作。它
我想制作一个 bool 向量,它是通过比较两个输入 bool 向量创建的。我可以使用 for 循环,但有更好的方法吗? 我理想的解决方案是这样的: df['A'] = [True, False, Fa
我想编写一个 pig 代码来执行分组并生成 31 个字段的总和,但在此之前我需要做一些自定义处理,为此我编写了一个 eval 函数。我想如果我可以将 GROUP 和 SUM 操作包含到 UDF 中,我
我试图通过 boolean 代数来理解使用 4 个与非门如何等同于 1 个异或门。 如果我们从维基百科看这张图片 http://en.wikipedia.org/wiki/XOR_gate#Alter
我是一名优秀的程序员,十分优秀!