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[

我试图在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[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))]