2
我有一个列表的列表,像这样:最快的方式
import numpy as np
import random
import time
import itertools
N = 1000
x =np.random.random((N,N))
y = np.zeros((N,N))
z = np.random.random((N,N))
list_of_lists = [[x, y], [y,z], [z,x]]
并为每个子表我想计算非零的个数,均值和标准差。
我已经做到了,像这样:
distribution = []
alb_mean = []
alb_std = []
start = time.time()
for i in range(len(list_of_lists)):
one_mean = []
non_zero_l = []
one_list = list_of_lists[i]
for n in one_list:
#count non_zeros
non_zero_count = np.count_nonzero(n)
non_zero_l.append(non_zero_count)
#assign nans
n = n.astype(float)
n[n == 0.0] = np.nan
#flatten the matrix
n = np.array(n.flatten())
one_mean.append(n)
#append means and stds
distribution.append(sum(non_zero_l))
alb_mean.append(np.nanmean(one_mean))
alb_std.append(np.nanstd(one_mean))
end = time.time()
print "Loop took {} seconds".format((end - start))
这需要0.23秒。
我试图使这个更快了第二个选项:
distribution = []
alb_mean = []
alb_std = []
start = time.time()
for i in range(len(list_of_lists)):
for_mean = []
#get one list
one_list = list_of_lists[i]
#flatten the list
chain = itertools.chain(*one_list)
flat = list(chain)
#count non_zeros
non_zero_count = np.count_nonzero(flat)
distribution.append(non_zero_count)
#remove zeros
remove_zero = np.setdiff1d(flat ,[0.0])
alb_mean.append(np.nanmean(remove_zero))
alb_std.append(np.nanstd(remove_zero))
end = time.time()
print "Loop took {} seconds".format((end - start))
这实际上是慢,需要0.88秒。
绝对数量的循环让我觉得有一个更好的方法来做到这一点。我已经尝试过numba
,但它并没有像在函数中追加一样。一个与3
迭代,另一个2
迭代 -
为什么要使用列表中,列出了* numpy的功能*?为什么不使用'numpy'数组? –
原谅我,因为我是numpy世界的新手,但是我正在做我所做的事情,因为列表中的数据表示numpy 2D矩阵 –
将输入数组'ints'与零。目前,使用'np.random.random((N,N))',它不可能有任何零,所以像'np.count_nonzero(n)'这样的计算是多余的。 – Divakar