我仍然是python和编程的新手,我正在试图弄清楚我是否正在以正确的方式解决这个问题。我倾向于采用matlab方法处理事情,但在这里我只是苦苦挣扎......
上下文: 我在this image on flickr中绘制了两个numpy数组,因为我无法在这里发布照片:(。它们具有相同的长度属性(均为777x1600)并且我正在尝试使用红色数组来帮助返回索引(值)在图的x轴上)和蓝色图中每个行的箭头指示的蓝色图中的点的元素值(y轴)。
我承担的程序是: a)确定红色阵列的最大值(图中用红点表示并已经实现)
和b)从蓝色数组的末尾开始,使用最后一个元素并向后计数,将元素与前一个元素进行比较。目标是确定前一个值减少的位置。 (例如,当元素-1大于元素-2时,表示图像中的最后一个峰值)。另外,为了防止在具有提升值的部分的尾端选择“噪声”,我还需要将所选值约束为大于红色数组的最大值。
这是我到目前为止所得到的,但是我被困在第二行,我必须从行中的(-1)位置到开头或(0)位置评估数组的选定行:
for i,n in enumerate(blue): #select each row of blue in turn to analyze
for j,m in enumerate(n): #select each element of blue ??how do I start from the end of array and work backwards??
if m > m-1 and m > max_val_red[i]:
indx_m[i] = j
val_m[i] = m
答案 0 :(得分:2)
要直接回答你的问题,你可以使用n [:: - 1]来反转arrray n。
所以代码是:
for j, m in enumerate(n[::-1]):
j = len(n)-j-1
# here is your code
但是为了提高计算速度,你应该避免使用python循环:
import numpy as np
n = np.array([1,2,3,4,2,5,7,8,3,2,3,3,0,1,1,2])
idx = np.nonzero(np.diff(n) < 0)[0]
peaks = n[idx]
mask = peaks > 3 # peak muse larger than 3
print "index=", idx[mask]
print "value=", peaks[mask]
输出是:
index= [3 7]
value= [4 8]
答案 1 :(得分:1)
我认为你的意思是:
if m > n[j-1] and m > max_val_red[i]:
indx_m[i] = j
val_m[i] = m
因为m > m - 1
始终为True
要反转轴上的数组,可以使用该轴上的::-1
索引数组,例如,可以使用轴1上的蓝色反转:
blue_reverse = blue[:, ::-1]
尝试看看你可以将你的函数编写为一组数组操作而不是循环(往往会更快)。这与其他答案类似,但它应该允许您避免当前使用的两个循环:
threshold = red.max(1)
threshold = threshold[:, np.newaxis] #this makes threshold's shape (n, 1)
blue = blue[:, ::-1]
index_from_end = np.argmax((blue[:, :-1] > blue[:, 1:]) & (blue[:, :-1] > threshold), 1)
value = blue[range(len(blue)), index_from_end]
index = blue.shape[1] - 1 - index_from_end
答案 2 :(得分:0)
抱歉,我没有阅读所有内容,但您可以查看内置功能。 所以不是枚举(n)。你可以做反转(枚举(n))。但是你的索引是错误的,正确的索引将是len(n) - j