小编use*_*913的帖子

在numpy中向矩阵行添加向量

在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方法.

numpy vector matrix

19
推荐指数
1
解决办法
3万
查看次数

Eclipse重构:更改所有子类的构造方法签名

在eclipse中,有没有一种方法可以重构超类构造函数的方法签名,以便所有具有相同签名的子类构造函数也可以以相同的方式重构?

java eclipse refactoring

5
推荐指数
1
解决办法
721
查看次数

处理#ifdef用于创建算法的多个版本

我试图对用C++编写的算法的许多(约25个)变体进行基准测试.

我使用三种方法的组合实现了这些变化:

  1. 复制代码并对复制的版本进行细微更改

  2. 子类化基本算法类

  3. 使用#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 指定的算法的多个变体的最佳方法是什么,该配置文件指定要运行的算法的哪个变体.

理想情况下,我只想编译一次代码,并在运行时使用配置文件选择算法变体.

c++ configuration c-preprocessor

5
推荐指数
1
解决办法
398
查看次数

Numpy 不准确的矩阵逆

在 numpy 中计算矩阵逆(求解线性系统)时,我似乎出现了令人无法接受的高错误。

  • 这是正常的不准确程度吗?
  • 如何提高此计算的准确性?
  • 另外,有没有一种方法可以在 numpy 或 scipy 中更有效地解决这个系统(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 linear-algebra scipy

5
推荐指数
1
解决办法
3577
查看次数

使用ndy中的1d数组从2d数组中选择多个元素

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中有更好的方法吗?

python arrays numpy

3
推荐指数
1
解决办法
1482
查看次数