“()”对于 numpy 沿轴应用意味着什么以及它与 0 有何不同

问题描述 投票:0回答:2

我试图更好地理解 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 有什么区别?

python numpy numpy-ndarray numpy-slicing
2个回答
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
投票

总结:鉴于上述上下文,() 和 0 有什么区别?

第一个表示具有一个元素的零维数组。第二个表示具有零个元素的一维数组。

零维数组始终只有一个元素。

示例:

>>> array = np.array(42)
>>> array
array(42)

零维数组的形状为

()

>>> array.shape
()

对零维数组进行索引会产生一个标量。

>>> array[()]
42

零维数组有点像标量,但它们有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.