Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 矢量化序贯numpy计算_Python_Performance_Numpy - Fatal编程技术网

Python 矢量化序贯numpy计算

Python 矢量化序贯numpy计算,python,performance,numpy,Python,Performance,Numpy,我在numpy中有许多操作,我可以在循环中完美地执行这些操作,但是我还不能在一个numpy调用中对它们进行矢量化 # data matrix d = np.random.rand(1496, 1, 2) # boolean matrix r = np.random.rand(5, 1496, 1, 2) > 0.5 # result matrix x = np.empty((5,)) # How can I avoid this loop? for i in xrange(r.sha

我在numpy中有许多操作,我可以在循环中完美地执行这些操作,但是我还不能在一个numpy调用中对它们进行矢量化

# data matrix
d = np.random.rand(1496, 1, 2)

# boolean matrix
r = np.random.rand(5, 1496, 1, 2) > 0.5

# result matrix
x = np.empty((5,))

# How can I avoid this loop?
for i in xrange(r.shape[0]):
  x[i] = d[r[i]].sum()

是否可以通过某种方式对循环进行矢量化来加快速度?

您可以这样对其进行矢量化;由于
d
是小于
r
的一维,当它们相乘时,
d
将沿着
r
轴=0
进行广播,从而避免循环;而且由于
r
是一个布尔数组,
d[r].sum()
将与
(d*r)相同。sum

(d * r).sum(axis=(1,2,3))
# array([ 775.17049697,  728.61537246,  735.05686655,  765.19469927,
#         759.44834287])
结果与
x
相同:

((d*r).sum(axis=(1,2,3)) == x).all()
# True

@Psidom方法的一种变体:

np.tensordot(d, r, axes=((0,1,2), (1,2,3)))
这取决于
tensordot
功能。从其:

给定两个张量(维数大于或等于1的数组),
a
b
,以及包含两个类似数组对象的类似数组对象,
(a\u轴,b\u轴)
,求出
a
b
元素(组件)的乘积之和在
a_轴
b_轴
指定的轴上

基本上,
tensordot
计算两个数组的乘积(就像@Psidom一样),并计算乘积数组中所有元素的总和。与@Psidom方法相比,该方法的唯一“优势”在于,它允许更灵活地指定在两个数组中哪个轴上执行乘积和求和。与@Psidom的方法相比,它没有提供更好的性能


另外,请参见。

将浮点和布尔矩阵相乘并使用广播的好主意(也感谢您的解释)。没有问题。很高兴能帮上忙。方法很有趣。你能解释一下吗?这会比@Psidom的建议更快吗?