术语:Python 和 Numpy - `iterable` 与 `array_like`
在使用 Numpy
的 Python 程序中,iterable
和 array_like
对象有什么区别呢?
在 Python 的文档中,iterable
和 array_like
经常会出现,它们有一些相似的特性。
我明白在这个上下文中,array_like
对象应该支持 Numpy
的一些操作,比如广播(broadcasting),不过 Numpy
数组也是可以被迭代的。那么可以说 array_like
是 iterable
的一种扩展(或者说超集?)吗?
2 个回答
虽然Sven的回答第一部分是对的,但我想补充一点,数组类似的对象不一定是可迭代的。
举个例子,在我的具体情况中,我想使用 numpy.rint()
这个函数,它可以接受一些类似数组的对象,这些对象里面的元素是 int
类型的标量。虽然这些对象不能被迭代,但它们还是可以被接受的。你也可以把 int
类型的数字传给 numpy.array()
,所以它们确实是类似数组的。
这里有来自“NumPy讨论”邮件列表的确认信息: https://mail.scipy.org/pipermail/numpy-discussion/2016-November/076224.html
“类数组”这个词在NumPy中使用,指的是任何可以作为第一个参数传给numpy.array()
来创建数组的东西。
而“可迭代”是Python的标准术语,意思是任何可以被逐个访问的东西(比如用for x in iterable
这样的方式)。
大多数类数组的对象都是可迭代的,唯一的例外是标量类型。
不过,并不是所有的可迭代对象都是类数组的。例如,你不能用numpy.array()
从生成器表达式创建NumPy数组。(你需要用numpy.fromiter()
来做这个。不过,在NumPy的术语中,生成器表达式并不算是“类数组”。)