我试图将二维数组中的每个项乘以一维数组中的相应项.如果我想将每列乘以1D数组,这很容易,如numpy.multiply函数所示.但我想做相反的事情,将行中的每个术语相乘.换句话说,我想成倍增加:
[1,2,3] [0]
[4,5,6] * [1]
[7,8,9] [2]
Run Code Online (Sandbox Code Playgroud)
得到
[0,0,0]
[4,5,6]
[14,16,18]
Run Code Online (Sandbox Code Playgroud)
但我得到了
[0,2,6]
[0,5,12]
[0,8,18]
Run Code Online (Sandbox Code Playgroud)
有没有人知道是否有一种优雅的方式来做numpy?非常感谢,Alex
假设你有n个方矩阵A1,...,An.无论如何要以整齐的方式将这些矩阵相乘吗?据我所知,numpy中的dot只接受两个参数.一种显而易见的方法是定义一个函数来调用自身并获得结果.有没有更好的方法来完成它?
在NumPy中,x*x*x比x**3或甚至np.power(x,3)快一个数量级.
x = np.random.rand(1e6)
%timeit x**3
100 loops, best of 3: 7.07 ms per loop
%timeit x*x*x
10000 loops, best of 3: 163 µs per loop
%timeit np.power(x, 3)
100 loops, best of 3: 7.15 ms per loop
Run Code Online (Sandbox Code Playgroud)
关于为什么会发生这种行为的任何想法?据我所知,三个产生相同的输出(用np.allclose检查).
人们对在Python中快速计算二面角有什么建议?
在图中,phi是二面角:


在0到pi范围内计算角度的最佳方法是什么?0到2pi怎么样?
这里的"最佳"意味着快速和数字稳定的混合.在0到2pi的整个范围内返回值的方法是首选,但如果您有一种非常快速的方法来计算0到pi的二面角,那么也是如此.
这是我最好的3个努力.只有第二个返回0到2pi之间的角度.它也是最慢的.
关于我的方法的一般评论:
Numpy的arccos()似乎很稳定但是由于人们提出这个问题,我可能还没有完全理解它.
使用einsum来自这里.为什么numpy的einsum比numpy的内置函数更快?
图表和一些灵感来自这里.如何在给定笛卡尔坐标的情况下计算二面角?
3条评论方法:
import numpy as np
from time import time
# This approach tries to minimize magnitude and sqrt calculations
def dihedral1(p):
# Calculate vectors between points, b1, b2, and b3 in the diagram
b = p[:-1] - p[1:]
# "Flip" the first vector so that eclipsing vectors have dihedral=0
b[0] *= -1
# Use dot product to find the components of b1 and b3 that are not
# perpendicular …Run Code Online (Sandbox Code Playgroud) 在NumPy中,如何将矢量列表优雅地规范化?
下面是它的例子不工作:
from numpy import *
vectors = array([arange(10), arange(10)]) # All x's, then all y's
norms = apply_along_axis(linalg.norm, 0, vectors)
# Now, what I was expecting would work:
print vectors.T / norms # vectors.T has 10 elements, as does norms, but this does not work
Run Code Online (Sandbox Code Playgroud)
最后一个操作产生"形状不匹配:对象不能广播到单个形状".
如何vectors使用NumPy优雅地完成2D矢量的归一化?
编辑:为什么上面的内容在添加维度时norms不起作用(按照下面的答案)?
如果我有numpy的阵列A和B,那么我可以计算出他们的矩阵产品的跟踪:
tr = numpy.linalg.trace(A.dot(B))
Run Code Online (Sandbox Code Playgroud)
然而,A.dot(B)当在迹线中仅使用对角线元素时,矩阵乘法不必要地计算矩阵乘积中的所有非对角线条目.相反,我可以这样做:
tr = 0.0
for i in range(n):
tr += A[i, :].dot(B[:, i])
Run Code Online (Sandbox Code Playgroud)
但是这会在Python代码中执行循环,并不像那样明显numpy.linalg.trace.
有没有更好的方法来计算numpy数组矩阵乘积的轨迹?什么是最快或最惯用的方式?
我通常从numpy的einsum函数中获得了很好的表现(我喜欢它的语法).@Ophion对这个问题的回答表明 - 对于测试的案例 - einsum始终优于"内置"功能(有时候会有一些,有时会很多).但我刚遇到一个einsum慢得多的情况.考虑以下等效函数:
(M, K) = (1000000, 20)
C = np.random.rand(K, K)
X = np.random.rand(M, K)
def func_dot(C, X):
Y = X.dot(C)
return np.sum(Y * X, axis=1)
def func_einsum(C, X):
return np.einsum('ik,km,im->i', X, C, X)
def func_einsum2(C, X):
# Like func_einsum but break it into two steps.
A = np.einsum('ik,km', X, C)
return np.einsum('ik,ik->i', A, X)
Run Code Online (Sandbox Code Playgroud)
我希望func_einsum跑得最快,但这不是我遇到的.在具有超线程,numpy版本1.9.0.dev-7ae0206的四核CPU上运行,以及使用OpenBLAS进行多线程处理,我得到以下结果:
In [2]: %time y1 = func_dot(C, X)
CPU times: user 320 ms, sys: 312 ms, total: 632 …Run Code Online (Sandbox Code Playgroud) 我在几个for循环中多次使用numpy的函数,但它变得太慢了.有没有办法更快地执行此功能?我读过你应该尝试在线循环,以及在for循环之前为函数创建局部变量,但似乎没有什么能提高速度(<1%).在len(UNIQ_IDS)〜800 emiss_data和obj_data有numpy的ndarrays具有形状=(2600,5200).我用import profile得到的瓶颈在哪里手柄,并且where在for循环是一个大的.
import numpy as np
max = np.max
where = np.where
MAX_EMISS = [max(emiss_data[where(obj_data == i)]) for i in UNIQ_IDS)]
Run Code Online (Sandbox Code Playgroud) 我想了解python的一个奇怪的行为.让我们考虑一个M有形状的矩阵6000 x 2000.该矩阵用有符号整数填充.我想计算np.transpose(M)*M.两种选择:
np.int32,操作大约需要150s.np.float64(使用dtype=...)时,相同的操作大约需要2秒.我们如何解释这种行为?我天真地认为int乘法比浮点乘法便宜.
非常感谢你的帮助.
我有一个由每个波段内的几个数字组成的3D阵列.是否有一个函数返回数组符合MULTIPLE条件的索引位置?
我尝试了以下方法:
index_pos = numpy.where(
array[:,:,0]==10 and array[:,:,1]==15 and array[:,:,2]==30)
Run Code Online (Sandbox Code Playgroud)
它返回错误:
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()
Run Code Online (Sandbox Code Playgroud)