arrays - 如何分别用其他元素和减少操作替换 np.dot 中的乘法和求和
问题描述
假设您有 2 个相对较大的数组a
和b
. 你可以使用广播来做一个dot
产品:
a = np.random.normal(size=(1000, 300))
b = a*2
ref = a.dot(b.T)
res = (a[:,None,:]*b[None,:,:]).sum(2)
np.allclose(ref, res)
# True
timeit -n 1 -r 5 a.dot(b.T)
# 17.6 ms
timeit -n 1 -r 5 (a[:,None,:]*b[None,:,:]).sum(2)
# 1.83 s
性能差异大约是 2 个数量级,对于更大的阵列来说甚至更大。
np.dot
更快,因为它使用专门的库,还因为它不在内存中存储完整的时间数组a[:,None,:]*b[None,:,:]
np.dot
总是先做乘法,然后再做减法。我想知道是否可以将乘法运算替换为任何其他元素运算(如np.maximum
, ==
, np.power
...),并通过其他归约运算(如np.max
. 我知道这将具有利基的实际应用程序,但我认为它在某些情况下可能很有用。
我尝试过使用numexpr
,但它对 funcs 和 dtypes 的支持有限。
我还尝试dype=object
使用自定义乘法和求和方法创建一个数组,但是您不再处理连续的内存块。
有没有任何有效的方法可以在 numpy 中实现这一点?
理想情况下,一些带有合成器的功能:np.custom_dot(a,b, elementwise_func=my_func, redux_func=my_other_func)
解决方案
推荐阅读
- excel - VBA:按变量自适应选择行、列、范围
- javascript - 如何根据一个对象内的字段过滤对象数组?
- ruby-on-rails - 访问 Rails 策略对象中的参数
- azure - Azure ADF v2-如何向部署到 Azure Data Lake 的文件名添加/附加时间戳
- javascript - 等待 NodeJS exec 然后杀死所有子进程
- jquery - jQuery .remove() 不工作?
- rx-java - RX Java 2 如何跟踪每个事件的总处理时间?
- python - 在 jquery 发布后获得响应
- javascript - 如何使用 JavaScript 读取 JSON 键和值?
- python - 拆分一个字符恰好重复两次的序列