术语:Python 和 Numpy - `iterable` 与 `array_like`

25 投票
2 回答
8451 浏览
提问于 2025-04-17 06:46

在使用 Numpy 的 Python 程序中,iterablearray_like 对象有什么区别呢?

在 Python 的文档中,iterablearray_like 经常会出现,它们有一些相似的特性。

我明白在这个上下文中,array_like 对象应该支持 Numpy 的一些操作,比如广播(broadcasting),不过 Numpy 数组也是可以被迭代的。那么可以说 array_likeiterable 的一种扩展(或者说超集?)吗?

2 个回答

5

虽然Sven的回答第一部分是对的,但我想补充一点,数组类似的对象不一定是可迭代的。

举个例子,在我的具体情况中,我想使用 numpy.rint() 这个函数,它可以接受一些类似数组的对象,这些对象里面的元素是 int 类型的标量。虽然这些对象不能被迭代,但它们还是可以被接受的。你也可以把 int 类型的数字传给 numpy.array(),所以它们确实是类似数组的。

这里有来自“NumPy讨论”邮件列表的确认信息: https://mail.scipy.org/pipermail/numpy-discussion/2016-November/076224.html

31

“类数组”这个词在NumPy中使用,指的是任何可以作为第一个参数传给numpy.array()来创建数组的东西。

而“可迭代”是Python的标准术语,意思是任何可以被逐个访问的东西(比如用for x in iterable这样的方式)。

大多数类数组的对象都是可迭代的,唯一的例外是标量类型。

不过,并不是所有的可迭代对象都是类数组的。例如,你不能用numpy.array()从生成器表达式创建NumPy数组。(你需要用numpy.fromiter()来做这个。不过,在NumPy的术语中,生成器表达式并不算是“类数组”。)

撰写回答