在numpy中有一种快速方法可以向矩阵的每一行或每列添加一个向量.
最近,我一直在将矢量平铺到矩阵的大小,这可能会占用大量内存.例如
mat=np.arange(15)
mat.shape=(5,3)
vec=np.ones(3)
mat+=np.tile(vec, (5,1))
Run Code Online (Sandbox Code Playgroud)
我能想到的另一种方法是使用python循环,但循环很慢:
for i in xrange(len(mat)):
mat[i,:]+=vec
Run Code Online (Sandbox Code Playgroud)
有没有一种快速的方法在numpy中执行此操作而不使用C扩展?
能够虚拟平铺矢量,就像更灵活的广播版本一样,真是太棒了.或者能够以行方式或列方式迭代操作,您几乎可以使用某些ufunc方法.
在eclipse中,有没有一种方法可以重构超类构造函数的方法签名,以便所有具有相同签名的子类构造函数也可以以相同的方式重构?
我试图对用C++编写的算法的许多(约25个)变体进行基准测试.
我使用三种方法的组合实现了这些变化:
复制代码并对复制的版本进行细微更改
子类化基本算法类
使用#ifdefs在代码片段之间切换
选项1和2产生的变化是可以的,因为我可以选择在配置文件中运行算法的哪个变体.然后,我可以遍历不同的配置文件并保留"配置:结果"对的记录 - 保留这些记录对我的工作非常重要.
我目前遇到问题,#ifdef因为我必须编译多个版本的代码来访问这些变体,这使得运行自动化实验脚本和保持结果的准确记录变得更加困难.在#ifdefS,然而,是非常有用的,因为如果我发现代码中的一个拷贝错误,那么我不记得要纠正这个错误的多个副本.
该#ifdef小号扩大我创建由两个复制代码和子类为24个总变化(4个变化为每个基本变化)6度的变化.
这是一个例子 - 主要是我使用#ifdefs来避免复制太多代码:
....
double lasso_gam=*gamma;
*lasso_idx=-1;
for(int aj=0;aj<(int)a_idx.size();aj++){
int j=a_idx[aj];
assert(j<=C*L);
double inc=wa[aj]*(*gamma)*signs[aj];
if( (beta_sp(j)>0 && beta_sp(j)+inc<0)
#ifdef ALLOW_NEG_LARS
|| (beta_sp(j)<0 && beta_sp(j)+inc>0)
#else
|| (beta_sp(j)==0 && beta_sp(j)+inc<0)
#endif
){
double tmp_gam=-beta_sp(j)/wa[aj]*signs[aj];
if(tmp_gam>=0 && tmp_gam<lasso_gam) {
*lasso_idx=aj;
*next_active=j;
lasso_gam=tmp_gam;
}
}
}
if(lasso_idx>=0){
*gamma=lasso_gam;
}
....
Run Code Online (Sandbox Code Playgroud)
问题:#ifdef在给定配置文件的情况下,允许运行当前由s 指定的算法的多个变体的最佳方法是什么,该配置文件指定要运行的算法的哪个变体.
理想情况下,我只想编译一次代码,并在运行时使用配置文件选择算法变体.
在 numpy 中计算矩阵逆(求解线性系统)时,我似乎出现了令人无法接受的高错误。
scipy.linalg.cho_solve看起来很有希望,但没有达到我想要的效果)?在下面的代码中,cholM是一个 128 x 128 矩阵。矩阵数据太大,无法包含在此处,但位于 Pastebin:cholM.txt上。
此外,原始向量ovec是随机选择的,因此对于不同的ovec,精度会有所不同,但在大多数情况下,误差似乎仍然高得令人无法接受。
编辑使用奇异值分解求解系统所产生的误差明显低于其他方法。
import numpy.random as rnd
import numpy.linalg as lin
import numpy as np
cholM=np.loadtxt('cholM.txt')
dims=len(cholM)
print 'Dimensions',dims
ovec=rnd.normal(size=dims)
rvec=np.dot(cholM.T,ovec)
invCholM=lin.inv(cholM.T)
svec=np.dot(invCholM,rvec)
svec1=lin.solve(cholM.T,rvec)
def back_substitute(M,v):
r=np.zeros(len(v))
k=len(v)-1
r[k]=v[k]/M[k,k]
for k in xrange(len(v)-2,-1,-1):
r[k]=(v[k]-np.dot(M[k,k+1:],r[k+1:]))/M[k,k]
return r
svec2=back_substitute(cholM.T,rvec)
u,s,v=lin.svd(cholM)
svec3=np.dot(u,np.dot(np.diag(1./s),np.dot(v,rvec)))
for k in xrange(dims):
print '%20.3f%20.3f%20.3f%20.3f'%(ovec[k]-svec[k],ovec[k]-svec1[k],ovec[k]-svec2[k],ovec[k]-svec3[k])
assert np.all( np.abs(ovec-svec)<1e-5 )
assert np.all( np.abs(ovec-svec1)<1e-5 )
Run Code Online (Sandbox Code Playgroud) numpy中有两个数组.第一个是2d数组,可以将其视为向量列表.第二个是1d数组,可以将其视为2d数组的索引列表.
我想使用1d数组的索引选择2d数组的元素.现在我一直在做
z=rnd.rand(2,10) # a list of 2d vectors of length 10
z_idx=rnd.randint(2,size=z.shape[1]) #indices selecting a dimension of the 2d vector
result=np.array([z[z_idx[i],i] for i in xrange(len(z_idx))])
Run Code Online (Sandbox Code Playgroud)
但这很慢.
在numpy中有更好的方法吗?