Numpy iterable与array_like这两个概念

Numpy iterable与array_like这两个概念

在使用Numpy的时候,有些时候会涉及到iterable与array_like这两个概念,这篇文章就来详细探讨一下这两个概念。

阅读更多:Numpy 教程

iterable是什么?

在Python中,我们称一个对象为iterable,当它支持迭代,也就是可以通过for循环来遍历其中的每一个元素时。例如list、tuple、str等都是iterable的。

lst = [1, 2, 3]
for i in lst:
  print(i)

输出:

1
2
3

我们可以使用Python内置的iter()函数把一个iterable转成一个iterator,然后使用next()函数一步步迭代,直到最后一个元素,再调用next()会抛出StopIteration的异常。

lst = [1, 2, 3]
it = iter(lst)
print(next(it))  # 1
print(next(it))  # 2
print(next(it))  # 3
print(next(it))  # 抛出StopIteration

因此,通过for … in或者iter()与next()函数,我们可以遍历iterable中的每一个元素。

array_like是什么?

在Numpy中,有一种叫做array_like的对象。它是一个广义的概念,指的是任何可以被当做数组来使用的对象,比如:

  • 一个Python的list,可以被视为一维数组;
  • 一个tuple的元素类型相同,可以被视为一个元素类型相同的多维数组(比如numpy的1×1的ndarray);
  • 一个numpy的ndarray或者子类;
  • 一个可迭代对象,并且包含的元素类型是相同的,可以被视为一个元素类型相同的多维数组。

同样的,我们也可以使用Python内置的iter()函数把一个array_like转成一个iterator,然后用next()函数一步步迭代其中的每一个元素。

import numpy as np

a = np.array([1, 2, 3])
it = iter(a)
print(next(it))  # 1
print(next(it))  # 2
print(next(it))  # 3

因此,array_like其实就是包含多个元素的一维、多维数组。

iterable vs array_like

现在我们来看一下iterable和array_like的区别。

首先,iterable是一类Python对象,可以通过for … in遍历每一个元素,但它不一定是数组,也就不能调用数组相关的操作。

接着,array_like并不仅仅是Python对象,还包括了一维、多维的ndarray,它们都支持数组相关的操作,比如reshape()dot()等等。

例如,我们可以使用numpy的一些函数来创建一个array_like对象,比如zeros()ones()等等。

import numpy as np

a = np.zeros((2, 3))
print(a)

输出:

array([[0., 0., 0.],
       [0., 0., 0.]])

此时的a就是一个2×3的ndarray,也可以被称为一个array_like对象。

另外,对于一些函数,接收到的数据类型必须是array_like类型,这时候如果你给它一个iterable对象,程序会抛出一个TypeError的异常。

例如,我们来看一下numpy的numpy.max()函数的参数类型:

import numpy as np

a = np.array([1, 2, 3])
lst = [4, 5, 6]

print(np.max(a))        # 3
print(np.max(lst))      # 6
print(np.max(lst, 1))   # TypeError: 'list' object is not callable

第一行和第二行说明了np.max()函数可以接收array_like类型的参数,也可以接收Python的list类型的参数,但是第三行抛出了TypeError的异常,这是因为我们在传入list类型的参数时,使用了一个额外的参数“axis”,这证明了numpy的一些函数在处理iterable和array_like时的差异。

因此,我们可以把iterable和array_like看做两个不同的概念,具有不同的功能和使用方法。

在实际使用中,我们应当充分理解iterable和array_like的概念,避免类型不匹配而导致的错误。

总结

  • iterable是Python中的一个概念,表示可以通过for … in遍历每一个元素的对象;
  • array_like是numpy中的一个概念,表示可以被视为数组使用的对象,包括一维、多维数组和一些可遍历的对象,如list等;
  • array_like支持数组相关的操作,而iterable不一定支持,差异体现在函数参数类型中;
  • 在实际使用中,应当充分理解iterable和array_like的概念,避免类型不匹配而导致的错误。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程