我对numpy完全陌生,找不到解决办法。 我在python中有一个二维浮点数列表,如:
list1[0..8][0..2]
例如:
^{pr2}$现在我要找到最小值和最大值:
b1 = numpy.array(list1)
list1MinX, list1MinY, list1MinZ = b1.min(axis=0)
list1MaxX, list1MaxY, list1MaxZ = b1.max(axis=0)
我需要一个循环做大约一百万次。在
它可以正常工作,但是比我以前的原生python方法慢了大约3倍。在
(1:15分钟[numpy]对0:25分钟[本地])
我做错什么了? 我不知道该怎么做,但我不知道该怎么做。在
编辑
作为请求一些非伪代码,虽然在我的脚本中列表是以另一种方式创建的。在
import numpy
import random
def moonPositionNow():
#assume we read like from a file, line by line
#nextChunk = readNextLine()
#the file is build like this
#x-coord
#y-coord
#z-coord
#x-coord
#...
#but we don't have that data here, so as a **placeholder** we return a random number
nextChunk = random.random()
return nextChunk
for w in range(1000000):
list1 = [[moonPositionNow() for i in range(3)] for j in range(9)]
b1 = numpy.array(list1)
list1MinX, list1MinY, list1MinZ = b1.min(axis=0)
list1MaxX, list1MaxY, list1MaxZ = b1.max(axis=0)
#Print out results
虽然列表的创建在这里可能是一个瓶颈,但我在原始代码中保证这不是问题所在。在
编辑2:
更新了示例代码以澄清,我不需要一个numpy数组的随机数。在
问题的出现是因为您正在将python列表传递给numpy函数。如果将numpy数组作为参数传递,numpy函数的速度要快得多。在
输出
^{pr2}$编辑:增加了如何在网格上计算成本函数的示例。在
下面计算网格上的二次成本函数,然后沿第一个轴取最小值。尤其是,
np.meshgrid
是你的朋友。在输出 100个回路,最好每回路3:13.9ms 10000个环路,最好每环路3:136µs
最后,如果您不能将问题转换成这个表单,您可以预先分配内存,然后填充每个元素。在
由于您的数据是以Python列表的形式提供的,所以在我看来,本机实现(可能调用一些优化的C代码)可能比先转换为numpy然后再调用优化的C代码要快。在
对于python对象,一次或最多一次地将数组转换为numpy数组。 本机实现(我假设它类似于在Python列表上调用
min
/max
)只需要循环一次数据。在此外,numpy的min/max函数似乎非常慢:https://stackoverflow.com/a/12200671/3005167
相关问题 更多 >
编程相关推荐