Python 矢量化序贯numpy计算
我在numpy中有许多操作,我可以在循环中完美地执行这些操作,但是我还不能在一个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
# 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的建议更快吗?