gpt4 book ai didi

python - 在 numpy 中执行交叉差异

转载 作者:行者123 更新时间:2023-11-28 20:44:59 24 4
gpt4 key购买 nike

我想按如下方式执行“交叉差异”:

cross_diff ( [a,b], [c,d] ) = [ [ a - c, a - d], [ b - c, b - d] ]

我有一个在 python 中执行此操作的例程,如下所示:

def crossdiff(a,b):
c = []
for a1 in range(len(a)):
for b1 in range(len(b)):
c.append (a[a1]-b[b1])
x = numpy.array(c)
x.reshape(len(a),len(b))
return x

问题是我必须创建一个 python 数组并将结果填充到其中,然后再转换回一个 numpy 数组。我希望能够采用 numpy 向量 a 和 b 并得到一个包含所有差异的 numpy 数组 c,因为上面代码的性能对于大向量大小来说很差。

是否可以将上述计算作为“纯”numpy 操作来执行?

编辑测试结果:

我通过 Python 分析器运行了此线程中列出的所有四个实现以进行比较。我不得不在工作站上运行它们,因为初始实现使用 ~4GB RAM 和 10k 元素。

import numpy
import cProfile

def cross_diff(A, B):
return A[:,None] - B[None,:]

def crossdiff2 (a,b):
ap = numpy.tile (a, (numpy.shape(b)[0],1))
bp = numpy.tile (b, (numpy.shape(a)[0],1))

return ap - bp.transpose()

def crossdiff(a,b):
c = []
for a1 in range(len(a)):
for b1 in range(len(b)):
c.append (a[a1]-b[b1])
x = numpy.array(c)
x.reshape(len(a),len(b))
return x

a = numpy.array(range(10000))
b = numpy.array(range(10000))

cProfile.run('crossdiff (a,b)')
cProfile.run('crossdiff2 (a,b)')
cProfile.run('cross_diff (a,b)')
cProfile.run('numpy.subtract.outer (a,b)')

结果: 原始 python 是 74.147 秒,我的版本是 1.656 秒,第 3 次实现 0.296 和 4 次 0.288。

最佳答案

尝试:

import numpy as np

np.array([a,b])[:,None] - np.array([c,d,e])[None,:]

一点解释:索引中的 None 会根据需要扩展维度。所以,实际上计算将是:

a a a     c d e     a-c  a-d  a-e
- =
b b b c d e b-c b-d b-e

非常有用,索引中的 None

再举一个例子:

import numpy as np

def cross_diff(A, B):
return A[:,None] - B[None,:]

vec_a = np.array([1,2,3,4])
vec_b = np.array([3,2,1])

print cross_diff(vec_a, vec_b)

关于python - 在 numpy 中执行交叉差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24537025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com