Python 函数减去列表中的每个元素
我试图在python中创建一个函数来从列表中减去每个元素,但是,第一个元素必须是Python 函数减去列表中的每个元素,python,numpy,func,Python,Numpy,Func,我试图在python中创建一个函数来从列表中减去每个元素,但是,第一个元素必须是nan 这是我的职责: def sub_vector(x): from numpy import nan y=[] for j, i in enumerate(range(len(x)-1)): z= np.nan if j == 0: y.append(z) else: val = x[i+1] - x[
nan
这是我的职责:
def sub_vector(x):
from numpy import nan
y=[]
for j, i in enumerate(range(len(x)-1)):
z= np.nan
if j == 0:
y.append(z)
else:
val = x[i+1] - x[i]
y.append(val)
return y
答复应如下:
zz = [1, 2, 3, 4, 5]
sub_vector(zz)
[nan, 1, 1, 1 ,1]
But this function is returning:
[nan, 1, 1, 1]
我的错误是什么?您可以使用prepend=np.nan
from numpy import nan
def sub_vector(x):
return [nan] + [x[i] - x[i - 1] for i in range(1, len(x))]
>>> np.diff(zz, prepend=np.nan)
array([nan, 1., 1., 1., 1.])
您的错误是不需要检查0
。这是因为枚举(范围(len(x)-1))
的结果是[(0,0)、(1,1)、(2,2)、(3,3)]
。因此,您只需迭代四个元素,而您的第一次迭代将被跳过
如果出现以下情况,请删除:
def sub_vector(x):
from numpy import nan
y=[np.nan]
for j, i in enumerate(range(len(x)-1)):
val = x[i+1] - x[i]
y.append(val)
return y
>>> sub_vector(zz)
[nan, 1, 1, 1, 1]
另外,enumerate(range(len(x)-1))
不是pythonic,效率低下,您可以单独使用enumerate
和start
参数
def sub_vector(x):
from numpy import nan
y=[]
for j, _ in enumerate(x, start=-1):
if j < 0:
y.append(np.nan)
continue
val = x[j+1] - x[j]
y.append(val)
return y
>>> sub_vector(zz)
[nan, 1, 1, 1, 1]
无论如何,如果您使用的是numpy
,numpy.diff
是一个不错的选择。您可以使用prepend=np.nan
>>> np.diff(zz, prepend=np.nan)
array([nan, 1., 1., 1., 1.])
您的错误是不需要检查0
。这是因为枚举(范围(len(x)-1))
的结果是[(0,0)、(1,1)、(2,2)、(3,3)]
。因此,您只需迭代四个元素,而您的第一次迭代将被跳过
如果出现以下情况,请删除:
def sub_vector(x):
from numpy import nan
y=[np.nan]
for j, i in enumerate(range(len(x)-1)):
val = x[i+1] - x[i]
y.append(val)
return y
>>> sub_vector(zz)
[nan, 1, 1, 1, 1]
另外,enumerate(range(len(x)-1))
不是pythonic,效率低下,您可以单独使用enumerate
和start
参数
def sub_vector(x):
from numpy import nan
y=[]
for j, _ in enumerate(x, start=-1):
if j < 0:
y.append(np.nan)
continue
val = x[j+1] - x[j]
y.append(val)
return y
>>> sub_vector(zz)
[nan, 1, 1, 1, 1]
无论如何,如果您使用的是numpy
,numpy.diff
是一个不错的选择。您使用的是if-else。移除其他条件和所有工程。
目前,它正在跳过循环迭代的第一次执行
import numpy as np
def sub_vector(x):
from numpy import nan
y=[]
for j, i in enumerate(range(len(x)-1)):
z= np.nan
if j == 0:
y.append(z)
val = x[i+1] - x[i]
y.append(val)
return y
print(sub_vector([1, 2, 3, 4, 5]))
您正在使用if-else。移除其他条件和所有工程。
目前,它正在跳过循环迭代的第一次执行
import numpy as np
def sub_vector(x):
from numpy import nan
y=[]
for j, i in enumerate(range(len(x)-1)):
z= np.nan
if j == 0:
y.append(z)
val = x[i+1] - x[i]
y.append(val)
return y
print(sub_vector([1, 2, 3, 4, 5]))
完全没有numpy
:
>>> from operator import sub
>>> list(map(sub, x, [float('nan'), *x])))
[nan, 1, 1, 1, 1]
这是因为x-float('nan')==float('nan')
对于任何x
可以从中减去nan
list(map(sub, x, [float('nan'), *x]))
== (map(sub, [1,2,3,4,5], [float('nan'), 1, 2, 3, 4, 5]))
== [1-float('nan'), 2-1, 3-2, 4-3, 5-4]
完全没有numpy
:
>>> from operator import sub
>>> list(map(sub, x, [float('nan'), *x])))
[nan, 1, 1, 1, 1]
这是因为x-float('nan')==float('nan')
对于任何x
可以从中减去nan
list(map(sub, x, [float('nan'), *x]))
== (map(sub, [1,2,3,4,5], [float('nan'), 1, 2, 3, 4, 5]))
== [1-float('nan'), 2-1, 3-2, 4-3, 5-4]
在子_向量函数中,不迭代所有输入向量,而是迭代len(x)-1,这意味着如果向量有5个元素,返回向量将只包含4个元素,则可以通过在如下范围内删除-1来解决此问题:
def sub_vector(x):
from numpy import nan
y=[]
for j, i in enumerate(range(len(x))):
z= np.nan
if j == 0:
y.append(z)
else:
val = x[i+1] - x[i]
y.append(val)
return y
你可以直接这样做
def sub_vector(x):
return [np.nan if x==0 else 1 for x in range(len(x))]
在子_向量函数中,不迭代所有输入向量,而是迭代len(x)-1,这意味着如果向量有5个元素,返回向量将只包含4个元素,则可以通过在如下范围内删除-1来解决此问题:
def sub_vector(x):
from numpy import nan
y=[]
for j, i in enumerate(range(len(x))):
z= np.nan
if j == 0:
y.append(z)
else:
val = x[i+1] - x[i]
y.append(val)
return y
你可以直接这样做
def sub_vector(x):
return [np.nan if x==0 else 1 for x in range(len(x))]