【发布时间】:2014-12-27 23:57:06
【问题描述】:
我有一个正在迭代的 numpy 数组:
import numpy
import math
array = numpy.array([[1, 1, 2, 8, 2, 2],
[5, 5, 4, 1, 3, 2],
[5, 5, 4, 1, 3, 2],
[5, 5, 4, 1, 3, 2],
[9, 5, 8, 8, 2, 2],
[7, 3, 6, 6, 2, 2]])
Pixels = ['U','D','R','L','UL','DL','UR','DR']
for i in range (1,array.shape[0]-1):
for j in range (1,array.shape[1]-1):
list = []
while len(list) < 2:
iToMakeList = i
jToMakeList = j
if iToMakeList > array.shape[0]-1 or iToMakeList < 1 or jToMakeList> array.shape[0]-1 or jToMakeList < 1:
break
PixelCoord = {
'U' : (iToMakeList-1,jToMakeList),
'D' : (iToMakeList+1,jToMakeList),
'R' : (iToMakeList,jToMakeList+1),
'L' : (iToMakeList,jToMakeList-1),
'UL' : (iToMakeList-1,jToMakeList-1),
'DL' : (iToMakeList+1,jToMakeList-1),
'UR' : (iToMakeList-1,jToMakeList+1),
'DR' : (iToMakeList+1,jToMakeList+1)
}
Value = {
'U' : array[iToMakeList-1][jToMakeList],
'D' : array[iToMakeList+1][jToMakeList],
'R' : array[iToMakeList][jToMakeList+1],
'L' : array[iToMakeList][jToMakeList-1],
'UL' : array[iToMakeList-1][jToMakeList-1],
'DL' : array[iToMakeList+1][jToMakeList-1],
'UR' : array[iToMakeList-1][jToMakeList+1],
'DR' : array[iToMakeList+1][jToMakeList+1]
}
candidates = []
for pixel in Pixels:
candidates.append((Value[pixel],pixel))
Lightest = max(candidates)
list.append(PixelCoord[Lightest[1]])
iToMakeList = PixelCoord[Lightest[1]][0]
jToMakeList = PixelCoord[Lightest[1]][1]
我想加快这个过程。它很慢。
假设这个 sn-p 的输出是我的最终目标,我唯一想做的就是加速这个代码。
【问题讨论】:
-
您的代码没有意义,因为
array,shape[0]将是一个数字,而不是您可以迭代的东西。此外,如何对其进行矢量化(或是否可能)将取决于您在循环中所做的“事情”。 -
大概
for i in array.shape[0]:应该是for i in range(array.shape[0]):(我犯过不止一次的错误)。 -
所以请验证我的代码是否在正确的轨道上:1) 您正尝试以
3x3 sub-matrix方式滑动通过您的array,2)在这个子矩阵中找到max的位置,并且3) 将此值附加到list直到list的长度为100 个元素?所以本质上你是在做一个 2D 卷积运算,内核可以找到所有值的maximum? -
是的,它是一种线跟踪器
-
如果一个数字大于它的所有邻居,会发生什么?例如在 1D 中:如果你有 1 3 2 4 3 5 ... 你会从 1 开始,移动到 3,然后呢?留在3点?移动到2?如果你移动到 2,它就会转到 4。所以这不会找到局部最大值。
标签: python for-loop numpy nested vectorization