python - 删除 for 循环以使其更快 - numpy
问题描述
我有这个使用numpy的python代码:
import numpy as np
table = np.array([[23, 54, 12],
[17, 32, 25],
[43, 19, 11],
[31, 22, 10],
[21, 19, 35]])
r, c = table.shape
out = np.zeros((r,c))
out[0, :] = np.cumsum(table[0,:])
out[:, 0] = np.cumsum(table[:,0])
for j in range(1, c):
for i in range(1, r):
out[i,j] = max( out[i-1,j], out[i,j-1] ) + table[i,j]
out[-1,-1]
我首先计算数组“out”的第一行和第一列,而其余的值是用 for 循环内的等式计算的。我只对表格的最后一个值( out[-1,-1] )感兴趣,我想尽可能快地完成它。我可以以某种方式删除两个“for”循环吗?
解决方案
我不完全确定您要完成什么。
您正在创建一个新out
数组,该数组从原始表中复制第一(0)行和列。(顺便说一下,在 处out[:, 0] = np.cumsum(table[:,0])
,您会覆盖在 处的元素[0, 0]
)。
out
然后,您可以通过取前一行中的元素或前一列中的元素的最大值来填充数组的其余部分。
然后,您将该位置的原始数组的内容添加table
到最大值。
由于您正在查找数组中以前的行和列,因此out
您经常会发现自己处于在检查这些值之前已覆盖这些值的情况。例如,当你在 时i=2, j=1
,你有数组
[[ 23. 77. 89.]
[ 40. 109. 0.]
[ 83. *?* 0.]
[114. 0. 0.]
[135. 0. 0.]]
您正在*?*
检查 109 和 83。您刚刚在上一次迭代中插入了 109。
因此,如果不使用那些 for 循环,您将无法获得相同的结果。
推荐阅读
- c# - Selenium 和 eCharts - 努力解析文本显示为弹出窗口
- flutter - 在小部件上方找不到正确的提供程序
- python - Python将具有多个工作表的xls转换为没有换行符或字节的csv
- javascript - 如何使R中的粘性导航栏闪亮?
- javascript - vanilla JavaScript carousel:在用户查看另一个选项卡然后返回后幻灯片比赛
- r - 如何处理 ggplot 中完全缺失的数据?
- java - SQLite 内存数据库间歇性地遇到 SQLITE_LOCKED_SHAREDCACHE
- angular - 我可以在哪里放置 ngx-toastr 配置文件?
- ios - Azure AD B2C 使用 Apple 登录:Web 重定向 url 无效
- r - 如何根据另一个数据框在 For 循环中对数据框进行子集化?