python - 计算密度图 D
问题描述
给定两个整数 n 和 r,使得 1 <= r < n,
一个大小为 nx n 的二维数组 W。
该数组的每个元素都是 0 或 1。
您的目标是使用 r 的半径计算数组 W 的密度图 D。
输出的密度图也是二维数组,
其中每个值表示指定半径内矩阵 W 中 1 的数量。
给定以下大小为 5 且半径为 1 的输入数组 W (n = 5, r = 1)
1 0 0 0 1
1 1 1 0 0
1 0 0 0 0
0 0 0 1 1
0 1 0 0 0
输出(使用 Python):
3 4 2 2 1
4 5 2 2 1
3 4 3 3 2
2 2 2 2 2
1 1 2 2 2
逻辑:输入第一行,第一列的值为1。r值为1。所以我们应该检查1个右元素,1个左元素,1个顶部元素,左上角,右上角,底部,左下角和右下角并对所有元素求和.
不应使用任何 3rd 方库。
我使用 for 循环和内部 for 循环来完成它并检查每个元素。有更好的解决方法吗?
解决方案
优化:对于 W 中的每个 1,更新位置的计数,它属于哪个邻域
尽管对于W
size nxn
,以下算法仍将采取 O(n^2) 步骤,但是如果 W 是稀疏的,即 1 的数量(例如k
)<< nxn
,那么代替所讨论rxrxnxn
的方法的步骤,以下将采取nxn + rxrxk
步骤,这要低得多如果k << nxn
给定r
分配并W
存储为
[[1, 0, 0, 0, 1],
[1, 1, 1, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 1, 1],
[0, 1, 0, 0, 0]]
然后跟随
output = [[ 0 for i in range(5) ] for j in range(5) ]
for i in range(len(W)):
for j in range(len(W[0])):
if W[i][j] == 1:
for off_i in range(-r,r+1):
for off_j in range(-r,r+1):
if (0 <= i+off_i < len(W)) and (0 <= j+off_j < len(W[0])):
output[i+off_i][j+off_j] += 1
将所需的值存储在output
对于r = 1
,output
是必需的
[[3, 4, 2, 2, 1],
[4, 5, 2, 2, 1],
[3, 4, 3, 3, 2],
[2, 2, 2, 2, 2],
[1, 1, 2, 2, 2]]
推荐阅读
- python - 使用 QuantLib Python 为远期利率协议定价
- time - 想要特定时间的一部分
- spring - 是否可以在 Spring 中将 @Unwrapped 与自定义 mongodb 转换器结合使用?
- android-mediaplayer - 我如何处理媒体播放器通知中的搜索?
- java - Kafka RocksDB 不断增长的磁盘大小
- javascript - 如何使用 http-proxy-middleware 代理特定主机?
- python - python / django登录问题
- ruby-on-rails - ActiveRecord::StatementInvalid: 运行“rake db:migrate:reset”时找不到表
- html - 跨度内的文本与正文内的文本之间的区别
- r - GGPLOT从不同的列添加箱线图