我看过几个使用numpy.apply_along_axis
的代码,我总是要测试代码,看看它是如何工作的,因为我还没理解Python中的axis
想法。
例如,我测试了参考文献中的this个简单代码。
我可以看到,对于第一种情况,它采用了矩阵每行的第一列,而在第二种情况下,考虑了行本身。
所以我构建了一个例子来测试它是如何使用矩阵数组的(这个问题带我到这个轴问题),它也可以看作是一个3d矩阵,其中每一行都是一个矩阵,对吗? / p>
a = [[[1,2,3],[2,3,4]],[[4,5,6],[9,8,7]]]
import numpy
data = numpy.array([b for b in a])
def my_func(x):
return (x[0] + x[-1]) * 0.5
b = numpy.apply_along_axis(my_func, 0, data)
b = numpy.apply_along_axis(my_func, 1, data)
哪位给了我:
array([[ 2.5, 3.5, 4.5],
[ 5.5, 5.5, 5.5]])
和
array([[ 1.5, 2.5, 3.5],
[ 6.5, 6.5, 6.5]])
对于第一个结果,我得到了我的预期。但对于第二个,我会收到:
array([[ 2., 3.],
[ 5., 8.]])
然后我可能应该是axis=2
,我得到了之前测试的结果。所以,我想知道这是如何正常工作的。
谢谢。
答案 0 :(得分:2)
首先,data=numpy.array(a)
已足够,无需使用numpy.array([b for b in a])
。
data
现在是形状为(2,2,3)
的3D ndarray
,并且有3个轴0, 1, 2
。第一轴的长度为2,第二轴的长度也为2,第三轴的长度为3.
因此,numpy.apply_along_axis(my_func, 0, data)
和numpy.apply_along_axis(my_func, 1, data)
都会产生形状为(2,3)
的2D数组。在这两种情况下,形状为(2,3)
,其余轴为第2和第3或第1和第3。
numpy.apply_along_axis(my_func, 2, data)
会返回您显示的(2,2)
形状数组,其中(2,2)
是前2轴的形状,就像apply
沿第3轴(通过给出索引) 2
)。
理解它的方法是,无论你应用哪个轴,都会'折叠'成my_func
的形状,在这种情况下会返回一个值。剩余轴的顺序和形状将保持不变。
另一种思考方式是:apply_along_axis
表示将该函数应用于该轴上的值,用于剩余轴/轴的每个组合。获取结果,并将它们组织回剩余轴/轴的形状。因此,如果my_func
返回tuple
个4个值:
def my_func(x):
return (x[0] + x[-1]) * 2,1,1,1
我们希望numpy.apply_along_axis(my_func, 0, data).shape
为(4,2,3)
。
numpy.apply_over_axes
以在多个轴上重复应用函数答案 1 :(得分:2)
请array
shape (2,2,3)
。可以看出axis 0
,axis 1
,axis 2
分别具有2,2,3个数据值。
这些是数组元素的索引
[
[
[(0,0,0) (0,0,1), (0,0,2)],
[(0,1,0) (0,1,1), (0,1,2)]
],
[
[(1,0,0) (1,0,1), (1,0,2)],
[(1,1,0) (1,1,1), (1,1,2)]
]
]
现在如果沿某个轴应用某些操作,则沿着此轴改变索引,只保持沿另外两个轴的索引不变。
示例:如果我们沿axis 0
应用一些操作F,那么结果的元素将是
[
[F((0,0,0),(1,0,0)), F((0,0,1),(1,0,1)), F((0,0,2),(1,0,2))],
[F((0,1,0),(1,1,0)), F((0,1,1),(1,1,1)), F((0,1,2),(1,1,2))]
]
沿着axis 1
:
[
[F((0,0,0),(0,1,0)), F((0,0,1),(0,1,1)), F((0,0,2),(0,1,2))],
[F((0,1,0),(1,1,0)), F((0,1,1),(1,1,1)), F((0,1,2),(1,1,2))]
]
沿着axis 2
:
[
[F((0,0,0),(0,0,1),(0,0,2)), F((0,1,0),(0,1,1),(0,1,2))],
[F((1,0,0),(1,0,1),(1,0,2)), F((1,1,0),(1,1,1),(1,1,2))]
]
也可以通过以给定数据的形状省略给定轴来推断得到的数组的形状。
答案 2 :(得分:1)
也许检查阵列的形状有助于澄清哪个轴是哪个;
print data.shape
>> (2,2,3)
这意味着调用
numpy.apply_along_axis(my_func, 2, data)
确实应该给出2x2矩阵,即
array([[ 2., 3.],
[ 5., 8.]])
因为第3轴(索引2)的长度为3,而其余轴的长度均为2。