我有一个信号,我想找到值的平均高度。这是通过找到过零点并计算每个过零点之间的最大值和最小值,然后对这些值求平均值来完成的。
当我想使用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
答案 0 :(得分:0)
np.where
和np.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.argwhere
将transpose
应用于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
来首先确定它将返回的数组的大小。