Python Numpy:编写适用于一维和二维数组的函数的好方法是什么

Python Numpy:编写适用于一维和二维数组的函数的好方法是什么,python,numpy,Python,Numpy,我想编写一个函数fx,它执行以下操作: 如果x是1D numpy数组,则返回gx 如果X是2D数字数组,则返回NP.数组[XXI席 实现这样的功能,什么样的方式比较合适 是否有一个特定于numpy的函数可以在一行中执行此操作,而无需写入if语句?ndim告诉您数组的维度,如: def f(x): if np.ndim(x) == 1: return g(x) elif np.ndim(x) == 2: return np.array([g(xi)

我想编写一个函数fx,它执行以下操作:

如果x是1D numpy数组,则返回gx 如果X是2D数字数组,则返回NP.数组[XXI席 实现这样的功能,什么样的方式比较合适

是否有一个特定于numpy的函数可以在一行中执行此操作,而无需写入if语句?

ndim告诉您数组的维度,如:

def f(x):
    if np.ndim(x) == 1:
        return g(x)
    elif np.ndim(x) == 2:
        return np.array([g(xi) for xi in x])
    else:
        # Whatever you want to do with more than 2 directions
        return None
ndim告诉您数组的维度,如:

def f(x):
    if np.ndim(x) == 1:
        return g(x)
    elif np.ndim(x) == 2:
        return np.array([g(xi) for xi in x])
    else:
        # Whatever you want to do with more than 2 directions
        return None

从一维向量生成标量的函数gx可以扩展到任意高维,如下所示:

import numpy as np

def myfunc(x):
    return sum(x)

def f( g, x ):
    if len(x.shape) == 1:
        return g(x)
    if len(x.shape) > 1:
        return np.array( [f(g,v) for v in x] )

# Test with one dimensional input
res = f( myfunc, np.array( [0.,1.,2.] ) )
print( res )

# Test with two dimensional input
res = f( myfunc, np.array( [[0.,1.,2.],[3.,4.,5.]] ) )
print( res )

# And, still more dimensions
res = f( myfunc, np.ones( (3,2,2) ) )
print( res )
生产,

3.0

[  3.  12.]

[[ 2.  2.]
 [ 2.  2.]
 [ 2.  2.]]

从一维向量生成标量的函数gx可以扩展到任意高维,如下所示:

import numpy as np

def myfunc(x):
    return sum(x)

def f( g, x ):
    if len(x.shape) == 1:
        return g(x)
    if len(x.shape) > 1:
        return np.array( [f(g,v) for v in x] )

# Test with one dimensional input
res = f( myfunc, np.array( [0.,1.,2.] ) )
print( res )

# Test with two dimensional input
res = f( myfunc, np.array( [[0.,1.,2.],[3.,4.,5.]] ) )
print( res )

# And, still more dimensions
res = f( myfunc, np.ones( (3,2,2) ) )
print( res )
生产,

3.0

[  3.  12.]

[[ 2.  2.]
 [ 2.  2.]
 [ 2.  2.]]


是的,这个解决方案很明显。但我想知道你是否真的会这样做。例如,如果提供参数轴,则函数np.sumx,axis的行为不同。您是否会使用if语句来区分这两种情况,而不是像any或foreach这样的内置函数?对于手头的问题,当维度为1或2时,您希望函数的行为有所不同。和其他复杂的逻辑相比,If语句是最简单、最好的。好的,谢谢。自从我发现np.sum比for循环中的求和要快,我就试着对pythonth持谨慎态度。pythonth的速度更快是因为不同的原因,因为numpy主要是用cython而不是python编写的,这使得它比您自己的python代码快得多。这根本不是一个numpythonic解决方案。不幸的是,由于原始问题的表述过于宽泛,因此没有具体的答案;但实际上,你永远不会用惯用的numpy编写这样的代码。是的,这个解决方案是显而易见的。但我想知道你是否真的会这样做。例如,如果提供参数轴,则函数np.sumx,axis的行为不同。您是否会使用if语句来区分这两种情况,而不是像any或foreach这样的内置函数?对于手头的问题,当维度为1或2时,您希望函数的行为有所不同。和其他复杂的逻辑相比,If语句是最简单、最好的。好的,谢谢。自从我发现np.sum比for循环中的求和要快,我就试着对pythonth持谨慎态度。pythonth的速度更快是因为不同的原因,因为numpy主要是用cython而不是python编写的,这使得它比您自己的python代码快得多。这根本不是一个numpythonic解决方案。不幸的是,由于原始问题的表述过于宽泛,因此没有具体的答案;但实际上,你永远不会用惯用的numpy编写这样的代码。当有人输入-1,但不注释时,这真是令人沮丧。如果你看到这一点,请改进。当有人把-1放进去,但不发表评论时,这确实令人沮丧。如果你看到这个,请改进一下,啊,这和穆罕默德的答案差不多……是的,我开始的时候没有答案,他打字更快。但这里有另一个技巧,请看编辑。Uff,这个论坛是如此的竞争:抓住一个像:谢谢。还有另一个技巧,根据您的问题可能会引起兴趣,请看numpy矢量化。乍一看,这似乎是针对1:1输出的,正如您描述的那样,每个1-d向量输入输出一个标量。在我注意到问题中指定的维度缩减之前,我开始把这个问题作为答案。是的,它与穆罕默德的答案大致相同……是的,我是在没有答案的时候开始的,他打字更快。但这里有另一个技巧,请看编辑。Uff,这个论坛是如此的竞争:抓住一个像:谢谢。还有另一个技巧,根据您的问题可能会引起兴趣,请看numpy矢量化。乍一看,这似乎是针对1:1输出的,正如您描述的那样,每个1-d向量输入输出一个标量。在我注意到问题中指定的维度缩减之前,我开始把这个问题作为答案。