Python - 将元组中的数组转换为普通数组

时间:2018-03-20 02:44:15

标签: python numpy

我有一个信号,我想找到值的平均高度。这是通过找到过零点并计算每个过零点之间的最大值和最小值,然后对这些值求平均值来完成的。

当我想使用np.where()查找信号过零的位置时,会出现问题。当我使用np.where()时,我得到一个元组中的结果,但我希望它在一个数组中,我可以计算零越过的次数。

我是Python的新手,来自Matlab,它对所有不同的类有点混乱。如您所见,我收到错误,因为nu = len(zero_u)给出了1,因为整个数组作为一个元素写在元组中。

任何想法如何解决这个问题?

代码如下所示:

import numpy as np


def averageheight(f):

    rms = np.std(f)

    f = f + (rms * 10**-6)

    # Find zero crossing

    fsign = np.sign(f)
    fdiff = np.diff(fsign)

    zero_u = np.asarray(np.where(fdiff > 0)) + 1
    zero_d = np.asarray(np.where(fdiff < 0)) + 1

    nu = len(zero_u)
    nd = len(zero_d)
    value_max = np.zeros((nu, 1))
    value_min = np.zeros((nu, 1))
    imaxvec = np.zeros((nu, 1))
    iminvec = np.zeros((nu, 1))

    if (nu > 2) and (nd > 2):

        if zero_u[0] > zero_d[0]:
            zero_d[0] = []

        nu = len(zero_u)
        nd = len(zero_d)
        ncross = np.fmin(nu, nd)

        # Find Maxima:
        for ic in range(0, ncross - 1):
            up = int(zero_u[ic])
            down = int(zero_d[ic])
            fvec = f[up:down]
            value_max[ic] = np.amax(fvec)
            index_max = value_max.argmax()
            imaxvec[ic] = up + index_max - 1

        # Find Minima:
        for ic in range(0, ncross - 2):
            down = int(zero_d[ic])
            up = int(zero_u[ic+1])
            fvec = f[down:up]
            value_min[ic] = np.amin(fvec)
            index_min = value_min.argmin()
            iminvec[ic] = down + index_min - 1

        # Remove spurious values, bumps and zero_d
        thr = rms/3

        maxfind = np.where(value_max < thr)

        for i in range(0, len(maxfind)):
            imaxfind = np.where(value_max == maxfind[i])
            imaxvec[imaxfind] = 0
            value_max[imaxfind] = 0

        minfind = np.where(value_min > -thr)

        for j in range(0, len(minfind)):
            iminfind = np.where(value_min == minfind[j])
            value_min[iminfind] = 0
            iminvec[iminfind] = 0

        # Find Average Height

        avh = np.mean(value_max) - np.mean(value_min)

    else:
        avh = 0

    return avh

1 个答案:

答案 0 :(得分:0)

np.wherenp.nonzero更加明确地解释了它返回一个元组,条件数组的每个维度都有一个数组:

In [71]: arr = np.random.randint(-5,5,10)
In [72]: arr
Out[72]: array([ 3,  4,  2, -3, -1,  0, -5,  4,  2, -3])
In [73]: arr.shape
Out[73]: (10,)
In [74]: np.where(arr>=0)
Out[74]: (array([0, 1, 2, 5, 7, 8]),)
In [75]: arr[_]
Out[75]: array([3, 4, 2, 0, 4, 2])

Out[74]元组可以直接用作索引。

您还可以从元组中提取数组:

In [76]: np.where(arr>=0)[0]
Out[76]: array([0, 1, 2, 5, 7, 8])

我认为这是比np.asarray(np.where(...))

更好的选择

当我们在二维数组上使用它时,where的这个约定变得更加清晰

In [77]: arr2 = arr.reshape(2,5)
In [78]: np.where(arr2>=0)
Out[78]: (array([0, 0, 0, 1, 1, 1]), array([0, 1, 2, 0, 2, 3]))
In [79]: arr2[_]
Out[79]: array([3, 4, 2, 0, 4, 2])

我们再次使用元组编制索引。 arr2[1,3]真的是arr2[(1,3)][]索引括号中的值实际上作为值元组传递给索引函数。

np.argwheretranspose应用于where的结果,生成数组:

In [80]: np.transpose(np.where(arr2>=0))
Out[80]: 
array([[0, 0],
       [0, 1],
       [0, 2],
       [1, 0],
       [1, 2],
       [1, 3]])

它是相同的索引数组,但排列在2d列矩阵中。

如果您需要where的计数而没有实际值,则功能稍快一些

In [81]: np.count_nonzero(arr>=0)
Out[81]: 6

实际上np.nonzero使用count来首先确定它将返回的数组的大小。