相关疑难解决方法(0)

在一个numpy数组中相乘

我试图将二维数组中的每个项乘以一维数组中的相应项.如果我想将每列乘以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

python arrays numpy

64
推荐指数
4
解决办法
7万
查看次数

将几个矩阵乘以numpy

假设你有n个方矩阵A1,...,An.无论如何要以整齐的方式将这些矩阵相乘吗?据我所知,numpy中的dot只接受两个参数.一种显而易见的方法是定义一个函数来调用自身并获得结果.有没有更好的方法来完成它?

python numpy

29
推荐指数
3
解决办法
3万
查看次数

为什么x**3比x*x*x慢?

在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 numpy

25
推荐指数
2
解决办法
3848
查看次数

Python中笛卡尔坐标中四点的二面角/扭转角

人们对在Python中快速计算二面角有什么建议?

在图中,phi是二面角:

二面角1

二面角2

在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)

python math numpy

23
推荐指数
1
解决办法
9238
查看次数

NumPy:如何快速标准化许多载体?

在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不起作用(按照下面的答案)?

python numpy vector normalization

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

在numpy中计算矩阵乘积轨迹的最佳方法是什么?

如果我有numpy的阵列AB,那么我可以计算出他们的矩阵产品的跟踪:

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数组矩阵乘积的轨迹?什么是最快或最惯用的方式?

python numpy matrix

14
推荐指数
2
解决办法
7942
查看次数

为什么numpy的einsum比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)

python performance numpy linear-algebra

11
推荐指数
2
解决办法
3947
查看次数

快速python numpy功能在哪里?

我在几个for循环中多次使用numpy的函数,但它变得太慢了.有没有办法更快地执行此功能?我读过你应该尝试在线循环,以及在for循环之前为函数创建局部变量,但似乎没有什么能提高速度(<1%).在len(UNIQ_IDS)〜800 emiss_dataobj_data有numpy的ndarrays具有形状=(2600,5200).我用import profile得到的瓶颈在哪里手柄,并且wherefor循环是一个大的.

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 performance for-loop numpy where

10
推荐指数
3
解决办法
5438
查看次数

Python Numpy:np.int32比np.float64"慢"

我想了解python的一个奇怪的行为.让我们考虑一个M有形状的矩阵6000 x 2000.该矩阵用有符号整数填充.我想计算np.transpose(M)*M.两种选择:

  • 当我"自然地"(即没有指定任何打字)时,numpy选择类型np.int32,操作大约需要150s.
  • 当我强制使用类型np.float64(使用dtype=...)时,相同的操作大约需要2秒.

我们如何解释这种行为?我天真地认为int乘法比浮点乘法便宜.

非常感谢你的帮助.

python floating-point numpy int32

10
推荐指数
2
解决办法
3241
查看次数

查找3D阵列符合MULTIPLE条件的索引位置

我有一个由每个波段内的几个数字组成的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)

python arrays numpy

8
推荐指数
3
解决办法
4962
查看次数