我已经看过使用numpy.apply_along_axis
的一些代码,而且我总是必须测试这些代码才能看到它是如何工作的,因为我还不了解Python中的axis
想法。
例如,我从引用中测试了this简单代码。
我可以看到,在第一种情况下,它是矩阵每一行的第一列,在第二种情况下,是考虑了行本身。
因此,我构建了一个示例来测试它如何与矩阵阵列(这个问题带给我这个轴问题)一起工作,该矩阵也可以看作是3d矩阵,其中每一行都是一个矩阵,对吗?
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
,但我得到了之前测试它的结果。因此,我想知道这如何正常工作。谢谢你。
最佳答案
首先,data=numpy.array(a)
已经足够,无需使用numpy.array([b for b in a])
。data
现在是具有ndarray
形状的3D (2,2,3)
,并且具有3个轴0, 1, 2
。第一 Axis 的长度为2,第二 Axis 的长度也为2,第三 Axis 的长度为3。
因此,numpy.apply_along_axis(my_func, 0, data)
和numpy.apply_along_axis(my_func, 1, data)
都将生成二维(2,3)
形状的数组。在这两种情况下,形状均为(2,3)
,其余 Axis 的形状分别为2nd和3rd或1st和3rd。numpy.apply_along_axis(my_func, 2, data)
返回您显示的(2,2)
形状数组,其中(2,2)
是前两个轴的形状,就像沿着第3 Axis 的apply
一样(通过给索引2
)。
理解的方式是您沿哪个轴应用都会折叠到my_func
的形状中,在这种情况下apply_along_axis
返回单个值。其余 Axis 的顺序和形状将保持不变。
另一种思考方式是:my_func
意味着针对其余 Axis/Axis 的每种组合,将该函数应用于该 Axis 上的值。获取结果,然后将它们重新组织成其余 Axis/Axis 的形状。因此,如果tuple
返回4个值的numpy.apply_along_axis(my_func, 0, data).shape
:
def my_func(x):
return (x[0] + x[-1]) * 2,1,1,1
我们期望
(4,2,3)
为numpy.apply_over_axes
。关于python - 了解Python中的 Axis ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23349128/