在numpy数组上映射函数的最有效方法是什么?我在当前项目中一直这样做的方式如下:
import numpy as np
x = np.array([1, 2, 3, 4, 5])
# Obtain array of square of each element in x
squarer = lambda t: t ** 2
squares = np.array([squarer(xi) for xi in x])
Run Code Online (Sandbox Code Playgroud)
但是,这看起来可能非常低效,因为我使用列表解析将新数组构造为Python列表,然后再将其转换回numpy数组.
我们可以做得更好吗?
如何从生成器对象中构建numpy数组?
让我来说明一下这个问题:
>>> import numpy
>>> def gimme():
... for x in xrange(10):
... yield x
...
>>> gimme()
<generator object at 0x28a1758>
>>> list(gimme())
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> numpy.array(xrange(10))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> numpy.array(gimme())
array(<generator object at 0x28a1758>, dtype=object)
>>> numpy.array(list(gimme()))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Run Code Online (Sandbox Code Playgroud)
在这个例子中,gimme()是我想要变成数组的输出的生成器.但是,数组构造函数不会迭代生成器,它只是存储生成器本身.我想要的行为来自numpy.array(list(gimme())),但我不想支付同时在内存中使用中间列表和最终数组的内存开销.有更节省空间的方式吗?
有时您必须在一个或多个大型Numpy阵列上执行许多中间操作.这很快就会导致MemoryErrors.在我迄今为止的研究中,你发现Pickling(Pickle,CPickle,Pytables等)并且gc.collect()是减轻这种情况的方法.我想知道在处理大量数据时是否还有其他有经验的程序员使用的技术(当然,除了删除策略/代码中的冗余).
另外,如果有一点我确定没有什么是免费的.使用其中一些技术,有什么权衡(即速度,稳健性等)?
有没有办法在Python中进行numpy数组理解?我看到它的唯一方法是使用列表理解,然后将结果转换为 numpy 数组,例如np.array(list comprehension). 我本来期望有一种方法可以直接使用 numpy 数组来完成此操作,而不使用列表作为中间步骤。
另外,是否可以重载列表运算符,即[和],以便结果是 numpy 数组,而不是列表。
我正在尝试减少使用两个矩阵执行一系列计算的函数的时间.寻找这个,我听说过numpy,但我真的不知道如何将它应用于我的问题.此外,我认为其中一个原因是让我的功能变慢是有很多点操作员(我在这个页面中听说过).
数学对应于二次分配问题的分解:

我的代码是:
delta = 0
for k in xrange(self._tam):
if k != r and k != s:
delta +=
self._data.stream_matrix[r][k] \
* (self._data.distance_matrix[sol[s]][sol[k]] - self._data.distance_matrix[sol[r]][sol[k]]) + \
self._data.stream_matrix[s][k] \
* (self._data.distance_matrix[sol[r]][sol[k]] - self._data.distance_matrix[sol[s]][sol[k]]) + \
self._data.stream_matrix[k][r] \
* (self._data.distance_matrix[sol[k]][sol[s]] - self._data.distance_matrix[sol[k]][sol[r]]) + \
self._data.stream_matrix[k][s] \
* (self._data.distance_matrix[sol[k]][sol[r]] - self._data.distance_matrix[sol[k]][sol[s]])
return delta
Run Code Online (Sandbox Code Playgroud)
在大小为20(Matrix为20x20)的问题上运行此操作需要大约20个segs,瓶颈在于此功能
ncalls tottime percall cumtime percall filename:lineno(function)
303878 15.712 0.000 15.712 0.000 Heuristic.py:66(deltaC)
Run Code Online (Sandbox Code Playgroud)
我试图应用于mapfor循环,但因为循环体不是函数调用,所以不可能.
我怎么能减少时间?
要回答eickenberg的评论:
sol是一种排列,例如[1,2,3,4].当我生成邻居解决方案时调用该函数,因此,[1,2,3,4]的邻居是[2,1,3,4].我只改变原始排列中的两个位置然后调用deltaC,它计算具有位置r,s swaped的解的分解(在上面的例子中r,s = 0,1).进行这种排列是为了避免计算邻居解决方案的全部成本.我想我可以将值存储 …
numpy ×5
python ×5
arrays ×1
generator ×1
heuristics ×1
matrix ×1
optimization ×1
performance ×1