我有一个三维的numpy形状阵列(2,2,2)。我想把它看作一个二维矩阵,一维数组作为条目。
我想要做的是在我的矩阵中对每个条目(即每个1-d数组)应用一个函数。我知道我可以向量化我的函数以将其应用于我的数组中的每个数字。我也知道我可以沿一个轴应用一个函数。但是,我还没有设法沿两个轴应用这些功能。
这是我最近的试用版:
import numpy as np
def sqrtSum(a, b):
return np.sqrt(a+b)
def sqrtSumWrapper(row):
return np.array([sqrtSum(x[0], x[1]) for x in row])
z = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
np.apply_along_axis(sqrtSumWrapper, 1, z)
在上面的示例中,我期望的结果将是具有条目((sqrt(3),sqrt(7)),(sqrt(11),sqrt(15))的形状(2,2)的数组。当我运行上面的代码时,我得到一个无效的标量变量索引。错误。
我想我错过了 apply_along_axis 如何运作的重要方面,并感谢您输入如何更正代码。
编辑: 到目前为止,答案主要集中在改变输入函数 sqrtSum 。这个功能只是一个例子。我对一个任意输入函数的一般答案很感兴趣,它接受n个输入参数并返回一个标量。
解决方案: 解决方案非常简单(我很遗憾,我还没有看到它)
import numpy as np
def sqrtSum(a, b):
return np.sqrt(a+b)
def sqrtSumWrapper(x):
return sqrtSum(x[0], x[1])
z = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
np.apply_along_axis(sqrtSumWrapper, 2, z)
感谢所有回复者。
答案 0 :(得分:1)
以下是正确使用numpy.apply_along_axis
的方法。要应用的函数必须是一维数组的函数:
def sqrtSum(arr):
return np.sqrt(np.sum(arr))
>>> z = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
>>> np.apply_along_axis(sqrtSum, 2, z)
array([[1.73205081, 2.64575131],
[3.31662479, 3.87298335]])
进行比较:
>>> np.array([[np.sqrt(3), np.sqrt(7)],[np.sqrt(11), np.sqrt(15)]])
array([[1.73205081, 2.64575131],
[3.31662479, 3.87298335]])
答案 1 :(得分:0)
你可以使用numpy的sum和sqrt函数。
z = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
s = np.sum(z,axis = 2)
print s.tolist()
# [[3, 7], [11, 15]]
sqrt = np.sqrt(s)