反向数组元素评估

时间:2011-12-06 04:26:57

标签: python arrays for-loop

我仍然是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

3 个答案:

答案 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