我试图更好地理解 numpy apply 沿轴。以下是 numpy 文档中的代码(https://numpy.org/doc/stable/reference/ generated/numpy.apply_along_axis.html)
import numpy as np
def my_func(a):
"""Average first and last element of a 1-D array"""
return (a[0] + a[-1]) * 0.5
b = np.array([[1,2,3], [4,5,6], [7,8,9]])
print(np.apply_along_axis(my_func, 0, b))
#array([4., 5., 6.])
print(np.apply_along_axis(my_func, 1, b))
#array([2., 5., 8.])
根据网页,上面的代码与下面的代码具有类似的功能,我从网页中获取并修改它(玩弄它)以理解它:
arr = np.array([[1,2,3], [4,5,6], [7,8,9]])
axis = 0
def my_func(a):
"""Average first and last element of a 1-D array"""
print(a, a[0], a[-1])
return (a[0] + a[-1]) * 0.5
out = np.empty(arr.shape[axis+1:])
Ni, Nk = arr.shape[:axis], arr.shape[axis+1:]
print(Ni)
for ii in np.ndindex(Ni):
for kk in np.ndindex(Nk):
f = my_func(arr[ii + np.s_[:,] + kk])
Nj = f.shape
for jj in np.ndindex(Nj):
out[ii + jj + kk] = f[jj]
#The code below may help in understanding what I was trying to figure out.
#print(np.shape(np.asarray(1)))
#x = np.int32(1)
#print(x, type(x), x.shape)
我从 numpy 文档中了解到,numpy 中的标量和数组具有相同的属性和方法。我试图理解 '()' 和 0 之间的区别。我知道 () 是一个元组。见下文。
示例:
在下面的代码中,第一个 for 循环不迭代,但第二个 for 循环迭代一次。 我试图理解为什么。
import numpy as np
for i in np.ndindex(0):
print(i) #does not run.
for i in np.ndindex(()):
print(i) #runs once
总结:鉴于上述上下文,() 和 0 有什么区别?
一个返回一个空列表,另一个返回一个包含一个元组的列表:
In [39]: list(np.ndindex(0))
Out[39]: []
In [40]: list(np.ndindex(()))
Out[40]: [()]
根据
ndindex
文档,它根据输入参数的形状返回元组:
At each iteration a tuple
of indices is returned, the last dimension is
iterated over first.
这对于像
这样的形状可能是最清楚的In [55]: list(np.ndindex((2,3)))
Out[55]: [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]
In [56]: list(np.ndindex((2,)))
Out[56]: [(0,), (1,)]
它在迭代 n 维形状数组时最有用。 但通常我们会尽量避免迭代(即使使用
apply_along_axis
)。
总结:鉴于上述上下文,() 和 0 有什么区别?
第一个表示具有一个元素的零维数组。第二个表示具有零个元素的一维数组。
零维数组始终只有一个元素。
示例:
>>> array = np.array(42)
>>> array
array(42)
零维数组的形状为
()
。
>>> array.shape
()
对零维数组进行索引会产生一个标量。
>>> array[()]
42
零维数组有点像标量,但它们有所不同。