如何在不使用numpy在python中使用for循环的情况下实现矩阵映射?

许伯里

我有三个阵列,一个src形状的阵列(width, height, 3),一个template形状的阵列(640, 480, 3)img_map形状的阵列(width, height, 2)

img_map存储src之间的x,y关系template,即src[4, 5] = template[img_map[0,4,5], img_map[1,4,5]]当映射建议的索引超出范围时,将不会分配任何值。

如何在不使用python的numpy的for循环的情况下实现这种值分配?

使用for循环将是这样,但是它太慢了。

for x in range(0, width): 
  for y in range(0, height):
    u = img_map[x,y,0]
    v = img_map[x,y,1]
    if (u >= 0) and (v >= 0) and (u < 640) and (v < 480):
      src[x,y,:] = template[u,v,:]
鲍夫

这是一个应该执行此任务的衬板版本:

src = template[img_map[:,:,0].ravel(),img_map[:,:,1].ravel(),:].reshape((width,height,3))

这是一个验证结果准确性并评估性能改进的小代码:

import numpy as np
import time

# Preparation of testdata
(width, height, depth) = (1000, 1000, 3)
template = np.random.randint(0, 256, (640,480,depth))
img_map = np.concatenate((
    np.random.randint(0, template.shape[0], (width*height,1)),
    np.random.randint(0, template.shape[1], (width*height,1))
  ), axis=1
).reshape(width,height,2)

# For loop verion
t_start = time.time()
src = np.zeros((img_map.shape[0],img_map.shape[1],template.shape[2]))
for x in range(0, img_map.shape[0]): 
  for y in range(0, img_map.shape[1]):
    u = img_map[x,y,0]
    v = img_map[x,y,1]
    if (u >= 0) and (v >= 0) and (u < template.shape[0]) and (v < template.shape[1]):
      src[x,y,:] = template[u,v,:]
print(f'Timer 1: {time.time()-t_start}s')

# One line version
t_start = time.time()
src2 = template[img_map[:,:,0].ravel(),img_map[:,:,1].ravel(),:].reshape((width,height,depth))
print(f'Timer 2: {time.time()-t_start}s')

# Verify that both gives the same result
print('Results are equal' if np.linalg.norm(src-src2)==0 else 'Results differ')

结果是相等的,并且执行时间大大缩短:

% python3 script.py
Timer 1: 2.7333829402923584s
Timer 2: 0.0499570369720459s
Results are equal

如有任何疑问,请不要犹豫。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不使用numpy或tensorflow中使用任何循环的情况下获取矩阵行?

Numpy - 如何在不使用 python 循环的情况下转换这个数组?

如何在不使用双循环的情况下加快矩阵的构建

如何在不使用for循环的情况下求和不同大小的矩阵的各个部分?

如何在 Python 中不使用 numpy 的情况下将两个稀疏矩阵相乘?

如何在不使用 numpy 和括号的情况下将嵌套列表制作成矩阵

如何在不使用for循环的情况下使用numpy数组访问列表的条目

如何在不使用循环的情况下使用numpy.lexsort

如何在不使用DefaultServeMux的情况下实现HandlerFunc

如何在不使用循环的情况下多次打印?

如何在不使用循环的情况下选择numpy数组的元素?

如何在不使用for循环的情况下向量化这两个numpy操作?

如何在不使用 numpy 的情况下在 python 中制作这个矩阵?

如何在不使用循环的情况下将 numpy 矩阵中的每一行除以同一行的最后一个元素?

在不使用嵌套的 if 和 for 循环的情况下计算矩阵?

如何在不使用循环的情况下获取python beautifulsoup中的特定部分

如何在不使用def的情况下循环整个python测验?

如何在不使用apply或循环的情况下每隔n列插入一列矩阵

如何在不使用for循环的情况下将几个列表中的每个项目映射到Java中的对象

如何在不使用库的情况下求解3x3矩阵的逆矩阵?

如何在不使用numpy的情况下在python中的矩阵中创建附近数字总和的矩阵

如何在不使用 useEffect 触发无限循环的情况下实现这一点

如何在不使用函数或类的情况下重复代码段以实现C ++中的高性能循环

如何在不使用Java中使用NULL的情况下实例化具有彼此循环引用的类?

如何在不使用循环的情况下获取大于或小于NumPy数组中每个项目的项目索引?

python - 如何在不使用kv文件的情况下使用python中的for循环将id设置为标签?

如何在不循环的情况下使用 NumPy 在 Python 中逐行应用均方误差

如何在不使用 C++ STL 的情况下在 C 中实现映射概念

在不使用for循环的情况下使用numpy优化python函数