为了提高内存效率,我一直在将我的代码从列表转换为生成器/迭代器。我发现很多情况下,我只是将自己制作的列表转换为一个
值得注意的是,
我正在研究
在我大多数特定情况下,我可以让它工作(主要处理对数似然,因此float64就可以),但这让我想知道为什么只有在
第一次猜测:
内存预分配?
我的理解是,如果您知道
数据类型转换?
我可以看到这对于将数据重新转换为新的
因此,为什么需要指定
np.array
,并采用np.array(some_list)
的代码模式。值得注意的是,
some_list
通常是一个正在迭代生成器的列表解析。我正在研究
np.fromiter
,看看是否可以更直接地使用生成器(而不必先将其强制转换为列表,然后将其转换为numpy数组),但我注意到与使用现有数据的任何其他数组创建例程不同,np.fromiter
函数需要指定dtype
。在我大多数特定情况下,我可以让它工作(主要处理对数似然,因此float64就可以),但这让我想知道为什么只有在
fromiter
数组创建器中才需要这样做,而其他数组创建器则不需要。第一次猜测:
内存预分配?
我的理解是,如果您知道
dtype
和count
,它允许预分配内存到结果np.array
中,并且如果您没有指定可选的count
参数,则会“按需调整输出数组大小”。但是,如果您没有指定计数,那么似乎应该能够在同样的方式中推断出dtype
,就像在正常的np.array
调用中一样。数据类型转换?
我可以看到这对于将数据重新转换为新的
dtype
很有用,但是其他数组创建例程也适用,而且似乎应该作为可选但不是必需的参数。因此,为什么需要指定
dtype
来使用np.fromiter
;或者换句话说,如果数组将按需调整大小,那么指定dtype
会产生哪些收益?更直接与我的问题相关的一个更微妙的版本:我知道当您不断地调整它们的大小时,np.ndarray
的许多效率增益都会丢失,因此,相对于np.fromiter([gen_elem for gen_elem in generator],dtype=d)
和np.array([gen_elem for gen_elem in generator],dtype=d)
,使用np.fromiter(generator,dtype=d)
有什么收益?
dtype
,除了 Tim Hochberg 想要一个具有指定dtype
的 1D 数组。关于添加形状参数,他们提到他们不想让代码更加复杂,而且array
有很多复杂情况,但这并不能回答为什么dtype
对于fromiter
而言仍然是必需的,但对于 任何其他 数组创建例程则不是。此外,该帖子已经有近十年历史了,numpy 自那以后已经发生了很多变化 - 因此可能考虑为了API一致性而进行更改。 - mpacer