Numpy:2d list min-max是s

2024-06-17 19:17:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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数组的随机数。在


Tags: 代码innumpy列表forrangerandomarray
2条回答

问题的出现是因为您正在将python列表传递给numpy函数。如果将numpy数组作为参数传递,numpy函数的速度要快得多。在

#Create numpy numbers
nptest = np.random.uniform(size=(10000, 10))
#Create a native python list
listtest = list(nptest)
#Compare performance
%timeit np.min(nptest, axis=0)
%timeit np.min(listtest, axis=0)

输出

^{pr2}$

编辑:增加了如何在网格上计算成本函数的示例。在

下面计算网格上的二次成本函数,然后沿第一个轴取最小值。尤其是,np.meshgrid是你的朋友。在

def cost_function(x, y):
    return x ** 2 + y ** 2

x = linspace(-1, 1)
y = linspace(-1, 1)

def eval_python(x, y):
    matrix = [cost_function(_x, _y) for _x in x for _y in y]
    return np.min(matrix, axis=0)

def eval_numpy(x, y):
    xx, yy = np.meshgrid(x, y)
    matrix = cost_function(xx, yy)
    return np.min(matrix, axis=0)

%timeit eval_python(x, y)
%timeit eval_numpy(x, y)

输出 100个回路,最好每回路3:13.9ms 10000个环路,最好每环路3:136µs

最后,如果您不能将问题转换成这个表单,您可以预先分配内存,然后填充每个元素。在

matrix = np.empty((num_x, num_y))
for i in range(num_x):
    for j in range(num_y):
        matrix[i, j] = cost_function(i, j)

由于您的数据是以Python列表的形式提供的,所以在我看来,本机实现(可能调用一些优化的C代码)可能比先转换为numpy然后再调用优化的C代码要快。在

对于python对象,一次或最多一次地将数组转换为numpy数组。 本机实现(我假设它类似于在Python列表上调用min/max)只需要循环一次数据。在

此外,numpy的min/max函数似乎非常慢:https://stackoverflow.com/a/12200671/3005167

相关问题 更多 >