Numpy 沿轴分割
是否有一个numpy函数可以将一个数组与另一个数组中的元素沿轴分割?例如,假设我有一个带有形状(l,m,n)的数组a,和一个带有形状(m,)的数组b;我要找的东西相当于:Numpy 沿轴分割,numpy,vector,divide,Numpy,Vector,Divide,是否有一个numpy函数可以将一个数组与另一个数组中的元素沿轴分割?例如,假设我有一个带有形状(l,m,n)的数组a,和一个带有形状(m,)的数组b;我要找的东西相当于: def divide_along_axis(a,b,axis=None): if axis is None: return a/b c = a.copy() for i, x in enumerate(c.swapaxes(0,axis)): x /= b[i]
def divide_along_axis(a,b,axis=None):
if axis is None:
return a/b
c = a.copy()
for i, x in enumerate(c.swapaxes(0,axis)):
x /= b[i]
return c
例如,这在规范化向量数组时非常有用:
>>> a = np.random.randn(4,3)
array([[ 1.03116167, -0.60862215, -0.29191449],
[-1.27040355, 1.9943905 , 1.13515384],
[-0.47916874, 0.05495749, -0.58450632],
[ 2.08792161, -1.35591814, -0.9900364 ]])
>>> np.apply_along_axis(np.linalg.norm,1,a)
array([ 1.23244853, 2.62299312, 0.75780647, 2.67919815])
>>> c = divide_along_axis(a,np.apply_along_axis(np.linalg.norm,1,a),0)
>>> np.apply_along_axis(np.linalg.norm,1,c)
array([ 1., 1., 1., 1.])
我认为你可以通过numpy通常的广播行为得到这种行为:
In [9]: a = np.array([[1., 2.], [3., 4.]])
In [10]: a / np.sum(a, axis=0)
Out[10]:
array([[ 0.25 , 0.33333333],
[ 0.75 , 0.66666667]])
如果我的解释正确的话
如果需要另一个轴,则可以转置所有轴:
> a = np.random.randn(4,3).transpose()
> norms = np.apply_along_axis(np.linalg.norm,0,a)
> c = a / norms
> np.apply_along_axis(np.linalg.norm,0,c)
array([ 1., 1., 1., 1.])
对于您给出的特定示例:将(l,m,n)数组除以(m,),您可以使用np.newaxis:
a = np.arange(1,61, dtype=float).reshape((3,4,5)) # Create a 3d array
a.shape # (3,4,5)
b = np.array([1.0, 2.0, 3.0, 4.0]) # Create a 1-d array
b.shape # (4,)
a / b # Gives a ValueError
a / b[:, np.newaxis] # The result you want
你可以阅读有关广播规则的所有内容。如果需要,还可以多次使用newaxis。(例如,将形状(3,4,5,6)数组除以形状(3,5)数组)
根据我对文档的理解,使用newaxis+广播也可以避免任何不必要的数组复制
现在更全面地描述了索引、newaxis等。(此答案首次发布后,文档已重新组织)。没有。这种方法失败了,例如我给出的二维数组。事实证明,在我给你的例子中,你可以做c=a/np.apply_沿_轴(np.linalg.norm,1,a)[,np.newaxis],但我正在寻找一些更一般的东西,比如我在问题中定义的函数divide_沿_轴()?或者你可以定义
沿_轴划分
,先对换,再对换,只需在1d数组中添加一个新的轴即可。