当我的一些数据包含"非数字"值时,我在制作直方图时遇到问题.我可以通过使用nan_to_numnumpy 摆脱错误,但是我得到了很多零值,这也搞乱了直方图.
pylab.figure()
pylab.hist(numpy.nan_to_num(A))
pylab.show()
Run Code Online (Sandbox Code Playgroud)
因此,我们的想法是制作另一个阵列,其中所有的纳米值都消失了,或者只是以某种方式在直方图中掩盖它们(最好使用一些内置方法).
我有以下代码正是我想要的(它是kriging方法的一部分).但问题是它太慢了,我想知道是否有任何选择将for-loop推向numpy?如果我推出numpy.sum,并在那里使用轴参数,它会加速一点点,但显然这不是瓶颈.关于我如何能够将forloop推向numpy以加快速度,还是以其他方式加速它的任何想法?)
# n = 2116
print GRZVV.shape # (16309, 2116)
print GinvVV.shape # (2117, 2117)
VVg = numpy.empty((GRZVV.shape[0]))
for k in xrange(GRZVV.shape[0]):
GRVV = numpy.empty((n+1, 1))
GRVV[n, 0] = 1
GRVV[:n, 0] = GRZVV[k, :]
EVV = numpy.array(GinvVV * GRVV) # GinvVV is numpy.matrix
VVg[k] = numpy.sum(EVV[:n, 0] * VV)
Run Code Online (Sandbox Code Playgroud)
我发布了ndarrays n矩阵的维度来清除一些东西
编辑:VV的形状是2116
我有一个关于如何尽可能快地计算numpy距离的问题,
def getR1(VVm,VVs,HHm,HHs):
t0=time.time()
R=VVs.flatten()[numpy.newaxis,:]-VVm.flatten()[:,numpy.newaxis]
R*=R
R1=HHs.flatten()[numpy.newaxis,:]-HHm.flatten()[:,numpy.newaxis]
R1*=R1
R+=R1
del R1
print "R1\t",time.time()-t0, R.shape, #11.7576191425 (108225, 10500)
print numpy.max(R) #4176.26290975
# uses 17.5Gb ram
return R
def getR2(VVm,VVs,HHm,HHs):
t0=time.time()
precomputed_flat = numpy.column_stack((VVs.flatten(), HHs.flatten()))
measured_flat = numpy.column_stack((VVm.flatten(), HHm.flatten()))
deltas = precomputed_flat[None,:,:] - measured_flat[:, None, :]
#print time.time()-t0, deltas.shape # 5.861109972 (108225, 10500, 2)
R = numpy.einsum('ijk,ijk->ij', deltas, deltas)
print "R2\t",time.time()-t0,R.shape, #14.5291359425 (108225, 10500)
print numpy.max(R) #4176.26290975
# uses 26Gb ram
return R
def getR3(VVm,VVs,HHm,HHs):
from numpy.core.umath_tests import inner1d
t0=time.time()
precomputed_flat = …Run Code Online (Sandbox Code Playgroud) 是否可以在其中仅包含 nan 的列上使用 ,numpy.nanargmin以便它返回。numpy.nan现在,ValueError当发生这种情况时,它会引发 , 。我不能使用numpy.argmin,因为当列中只有几个 nan 时,这会失败。
http://docs.scipy.org/doc/numpy/reference/ generated/numpy.nanargmin.html 说 是ValueError针对全 nan 切片提出的。在这种情况下,我希望它返回 numpy.nan (只是为了进一步用 nan 掩盖“非数据”)
接下来的一点就是这样做的,但是速度超级慢并且不是真正的Pythonic:
for i in range(R.shape[0]):
bestindex = numpy.nanargmin(R[i,:])
if(numpy.isnan(bestindex)):
bestepsilons[i]=numpy.nan
else:
bestepsilons[i]=epsilon[bestindex]
Run Code Online (Sandbox Code Playgroud)
接下来的一点也有效,但前提是不涉及所有 nan 列:
ar = numpy.nanargmin(R, axis=1)
bestepsilons = epsilon[ar]
Run Code Online (Sandbox Code Playgroud)
所以理想情况下,我希望最后一点也能与全纳米列一起使用
我已经编写了下面这段代码,它完全符合我的要求,但速度太慢了.我确信有一种方法可以让它更快,但我似乎无法找到它应该如何完成.代码的第一部分只是为了显示哪种形状.
测量(VV1和HH1)
预计算值,VV模拟和HH模拟的两个图像,它们都依赖于3个参数(预先计算(101, 31, 11)值)
索引2只是将VV和HH图像放在同一个ndarray中,而不是制作两个3darrays
VV1 = numpy.ndarray((54, 43)).flatten()
HH1 = numpy.ndarray((54, 43)).flatten()
precomp = numpy.ndarray((101, 31, 11, 2))
Run Code Online (Sandbox Code Playgroud)
我们让三个参数中的两个变化
comp = numpy.zeros((len(parameter1), len(parameter2)))
for i,(vv,hh) in enumerate(zip(VV1,HH1)):
comp0 = numpy.zeros((len(parameter1),len(parameter2)))
for j in range(len(parameter1)):
for jj in range(len(parameter2)):
comp0[j,jj] = numpy.min((vv-precomp[j,jj,:,0])**2+(hh-precomp[j,jj,:,1])**2)
comp+=comp0
Run Code Online (Sandbox Code Playgroud)
我知道我应该做的显而易见的事情是摆脱尽可能多的for循环,但我不知道如何numpy.min在处理更多维度时使行为正常.
第二件事(不太重要,如果它可以得到矢量化,但仍然很有趣)我注意到它主要占用CPU时间,而不是RAM,但我已经搜索了很长时间,但我找不到一种方法来写"parfor "在matlab中代替"for",(@parallel如果我只是将for循环放在一个单独的方法中,是否可以制作一个装饰器?)
编辑:回答Janne Karila:是的,肯定会改善它,
for (vv,hh) in zip(VV1,HH1):
comp+= numpy.min((vv-precomp[...,0])**2+(hh-precomp[...,1])**2, axis=2)
Run Code Online (Sandbox Code Playgroud)
肯定是快得多,但有没有可能删除外部for循环?有没有办法使for-loop并行,有@parallel什么东西?
我是编程新手,我被随机数生成困扰了.我可以使用随机函数"randint"生成随机数,但无法生成一组随机数.例如,我想获得10个随机数.
from random import randint
x = randint(1, 100)
y = randint(1, 100)
isFailedTest = (5<=x<=15) and (10<=y<=11)
selected_test = [x,y]
while (isFailedTest == False):
Run Code Online (Sandbox Code Playgroud)
我可以一次生成1个随机数,但一次不能生成10个随机数.这里1个数字意味着2维数字例子(x,y)=(10,20)我想在我的条件之后获得10个随机数(x,y).我如何实现这一目标?我对编程很新,所以无法弄清楚可以做些什么.所有帮助/建议/推荐都非常感谢.谢谢.