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

2024-04-20 00:49:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个信号,我想找到平均高度的值。这是通过找到零交叉点并计算每个零交叉点之间的最大值和最小值,然后平均这些值来实现的。你知道吗

当我想用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

Tags: forlenvaluenpzerosfindminwhere
1条回答
网友
1楼 · 发布于 2024-04-20 00:49:47

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(...))更好的选择

当我们在2d数组上使用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]])

这是相同的索引数组,但排列在二维列矩阵中。你知道吗

如果需要where的计数而不需要实际值,则可以使用稍微快一点的函数

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

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

相关问题 更多 >