如何迭代numpy数组的“某些”维度?

时间:2018-05-02 08:29:28

标签: python arrays numpy functional-programming

我有一个三维的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)

感谢所有回复者。

2 个答案:

答案 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)