假设下面的函数根据Set
和Numbers
计算Uval
和Lval
函数。对于前两个数字U
和52599
是有关系的,L
和52550
是有关系的,因为第二个数字的标签是L
,所以使用Lval
方程。前一个函数是previous = numbers[1:]
,当前函数是current = numbers[:-1]
。所以(52550 - 52599)/52550 * -100
将是前两个数字的计算。方程应该被计算到Set
和Numbers
数组的末尾。然而,代码给了我下面的错误,Set
和Numbers
数组的长度都是15。
功能:
Set = np.array(['U', 'L', 'U', 'L', 'U', 'L', 'U', 'L', 'U', 'L', 'U', 'L', 'U', 'L', 'U'])
Numbers = np.array([ 52599, 52550, 53598, 336368, 336875, 337466, 338292, 356587, 357474, 357763, 358491, 358659, 359041, 360179, 360286])
Lval = (Numbers[:-1] - Numbers[1:])/Numbers[:-1] * -100
Uval = (Numbers[1:] - Numbers[:-1])/ Numbers[1:] * -100
Numbers * np.where(Set == 'U', Uval, Lval)
错误输出:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-12-3ddad609950b> in <module>
4 Uval = (Numbers[1:] - Numbers[:-1])/ Numbers[1:] * -100
5 print(len(Set))
----> 6 Numbers * np.where(Set == 'U', Uval, Lval)
<__array_function__ internals> in where(*args, **kwargs)
ValueError: operands could not be broadcast together with shapes (15,) (14,) (14,)
你的切片符号不像你想象的那样:
in: Numbers[:-1]
是否不将数组中的元素移位1。它取直到但不包括最后一个元素的所有元素。输出为:
in: Numbers[:-1]
out: array([ 52599, 52550, 53598, 336368, 336875, 337466, 338292, 356587,
357474, 357763, 358491, 358659, 359041, 360179])
是number中的所有元素,除了最后一个360286。
您需要使用np.roll()函数将元素移动1。这将把最后一个元素滚动到前面:
in: np.roll(Numbers, 1)
out: array([360286, 52599, 52550, 53598, 336368, 336875, 337466, 338292,
356587, 357474, 357763, 358491, 358659, 359041, 360179])
所以你必须处理如何处理第一个和最后一个数字的边缘情况,例如你的数组长度是15,所以你只能为L或u获得14个新元素