Python Numpy:编写适用于一维和二维数组的函数的好方法是什么
我想编写一个函数fx,它执行以下操作: 如果x是1D numpy数组,则返回gx 如果X是2D数字数组,则返回NP.数组[XXI席 实现这样的功能,什么样的方式比较合适 是否有一个特定于numpy的函数可以在一行中执行此操作,而无需写入if语句?ndim告诉您数组的维度,如: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)
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向量输入输出一个标量。在我注意到问题中指定的维度缩减之前,我开始把这个问题作为答案。