【问题标题】:How do I slice an array column-wise within a for loop, adding a new column from the array to a new array for each iteration?如何在 for 循环中按列对数组进行切片,为每次迭代将数组中的新列添加到新数组中?
【发布时间】:2020-09-05 00:16:09
【问题描述】:

我正在将正交匹配追踪算法从 MATLAB 转录到 Python,但我在代码的特定部分遇到了问题。

Matlab 代码为:

indx=zeros(L,1);
for j=1:1:L
     proj=D'*residual;
     [maxVal,pos]=max(abs(proj));
     pos=pos(1);
     indx(j)=pos;
     a=pinv(D(:,indx(1:j)))*x;
     residual=x-D(:,indx(1:j))*a;

到目前为止,我对 Python 的了解是:

indx = np.zeros([L,], dtype=int)
for j in range(L):
    proj = D.T @ resid
    maxVal, pos = np.amax(np.absolute(proj)), np.argmax(np.absolute(proj), axis = 0)                
    indx[j] = pos               
    d = D[:, indx[j]]
    a = np.linalg.pinv(d) @ x  # take pseudo-inverse of array D and matrix multiply by x
    resid = np.subtract(x, d * a)

我的问题始于无法像在 MATLAB 中那样在 Python 中创建大小未定的空数组。例如,对于 MATLAB 如何在 Python 或 Numpy 中创建空数组 (a = []),我还没有找到令人满意的复制。目前,我在提供的代码上方将a 初始化为a = []。我认为这是另一回事,但在这种情况下,一个解决方案将在以后对我有所帮助。

稍微描述一下代码在 MATLAB 中的作用,L = 2,所以如果 j = 1 用于第一次迭代,D(:,indx(1:j)) 将是一个 34x1 矩阵,列 indx(1)(可以是 1 中的任何整数到 80(含)填充 34 行。下一次迭代将是从 D 中选择的另一列,这将使D(:,indx(1:j)) 成为一个 34x2 矩阵,两列都完好无损。

为了清楚起见,我在 python 版本中将切片分成变量d。目前,它会在第二次迭代中使用来自indx 的新编号覆盖先前选择的列。我真的不知道从这里去哪里。我尝试了几种不同的切片方式,但都没有奏效。我最接近得到我想要的东西是设置indx = np.zeros([L,], dtype=int)d = D[:,indx[j]],它给出indx.shape = (2,),但是因为0是Python中的索引,第一次迭代选择了D的第0列,所以我得到了34x2 数组,但有一个过早选择/添加的列。如果我执行 d = D[:, indx[0:j]],我会得到一个空的 34x0 数组,用于 d

【问题讨论】:

  • python 中的典型切片x:y:i 运行为xx+i、...、y-1。所以你需要写d = D[:, indx[0:j+1]]来实现你所描述的。
  • @amzon-ex 做到了。我知道我已经尝试过了,但我可能没有用indx = np.zeros([L,], dtype=int) 尝试过。它可能设置为 indx = np.zeros([L,1], dtype=int) ,这给了我 d.shape = (34, 2, 1) 。我来到这里是因为我在这个问题上工作太久了,我知道我错过了一些简单的东西。感谢您的帮助。

标签: python arrays matlab numpy machine-learning


【解决方案1】:

我认为可能缺少一些信息,但是对于您的第一个问题,numpy 可以使用 np.empty 初始化一个空数组,您也许可以探索这是否可以帮助您。

对于您的第二个问题,我从您所写的内容中假设您希望通过每个索引从数组中获取越来越多的列。如果是这样,您可以使用 d = D[:, 0:indx+1] 其中 indx 是您想要的行的整数

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    相关资源
    最近更新 更多