繁体   English   中英

在 Julia 或 python 中检索矩阵的顺序删除列(也删除一行)的原始索引

retrieve original index of sequentially removed column (a row is also removed) of an matrix in Julia or python

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我想在删除前一个总和最大的列后,在每次迭代中检索总和最大的列的原始索引。 同时,每次迭代时,删除列的相同索引的行也从矩阵中删除。

例如,在 10 x 10 矩阵中,第 5 列的总和最大,因此删除第 5 列和第 5 行。 现在矩阵是 9 x 9 并且重新计算列的总和。 假设第 6 列的和最大,因此删除当前矩阵的第 6 列和第 6 行,即原始矩阵中的第 7 行。 反复执行此操作,直到保留所需的列数索引。

我在 Julia 中不起作用的代码粘贴在下面。 for 循环中的第二步是不正确的,因为每次迭代都会删除一行,因此列的总和不同。

谢谢!

# a matrix of random numbers
mat = rand(10, 10);
# column sum of the original matrix
matColSum = sum(mat, dims=1);

# iteratively remove columns with the largest sum
idxColRemoveList = [];
matTemp = mat;

for i in 1:4  # Suppose 4 columns need to be removed

    # 1. find the index of the column with the largest column sum at current iteration
    sumTemp = sum(matTemp, dims=1);
    maxSumTemp = maximum(sumTemp);
    idxColRemoveTemp = argmax(sumTemp)[2];
    
    # 2. record the orignial index of the removed scenario
    idxColRemoveOrig = findall(x->x==maxSumTemp, matColSum)[1][2];
    push!(idxColRemoveList, idxColRemoveOrig);
    
    # 3. update the matrix. Note that the corresponding row is also removed.
    matTemp = matTemp[Not(idxColRemoveTemp), Not(idxColRemoveTemp)];

end
2 个回复

蟒蛇解决方案:

import numpy as np

mat = np.random.rand(5, 5)
n_remove = 3

original = np.arange(len(mat)).tolist()
removed = []

for i in range(n_remove):
    col_sum = np.sum(mat, axis=0)
    col_rm = np.argsort(col_sum)[-1]
    removed.append(original.pop(col_rm))
    mat = np.delete(np.delete(mat, col_rm, 0), col_rm, 1)

print(removed)
print(original)
print(mat)

我猜您遇到的问题是跟踪原始数组中当前列/行的索引是什么信息。 我刚刚使用了一个列表[0, 1, 2, ...]然后在每次迭代中弹出一个值。

对问题进行编码的一种更简单的方法是用非常小的数字替换所选列中的元素,而不是删除该列。 这种方法避免了使用“排序”和“弹出”来提高代码效率。

import numpy as np

n = 1000
mat = np.random.rand(n, n)
n_remove = 500
removed = []

for i in range(n_remove):
    # get sum of each column
    col_sum = np.sum(mat, axis=0)
    col_rm = np.argmax(col_sum)
    # record the column ID
    removed.append(col_rm)
    
    # replace elements in the col_rm-th column and row with the zeros
    mat[:, col_rm] = 1e-10
    mat[col_rm, :] = 1e-10  
   
print(removed)

1 Rcpp:从矩阵中删除列和行[重复]

这个问题已经在这里有了答案: RCPP NumericMatrix-如何删除行/列? 2个答案 我正在尝试创建一个函数,该函数采用矩阵nxp和索引e ,并返回通过从X消除第e列和第e行获得的子矩阵。我认为最简单的方法是创建一个n -1 xp-1矩阵,并在其中插入第 ...

2015-10-14 07:27:48 1 284   rcpp
2 基于Julia中列的重复值删除矩阵行

这是朱莉娅的另一个挑战。 想象一下何时具有以下矩阵: 我要删除第一列元素重复的矩阵行。 例如,将产生以下矩阵: 行的删除是任意的,因为我们不保留第一列的重复值。 我该如何实现? ...

4 从矩阵删除列

我正在与Matlab合作,但我遇到以下问题。 我有一个矩阵,比方说A 我希望能够删除只有零但仅在最后一列之后至少有一个1的列,即列5和列6而不是列2。我不能只做A(:,5)=[]因为在我的问题我不知道哪些列有零,它们到底。 ...

5 在Python中删除列

有一个用逗号分隔的文件,其中包含约50列和几行,因此我需要删除所有始终为0的列(即该列中的所有值为零)。 使用以下代码读取文件: 如何从该内存结构中准确删除列(为0)。 如果没有重写和重新读取到另一个临时csv文件来实现这一点,那就更好了。 ...

7 如何从kdb表中按索引删除列?

例如,如何从下表中删除第一列: 预期结果: 可以使用delete a from t但我希望能够在不事先知道确切列名的情况下进行删除。 ...

2018-09-25 10:46:07 4 196   kdb
8 从数据框中删除列索引

我通过传递cordinates(开始和结束)从excel表中提取了多个数据帧现在我根据cordinates使用下面的函数来extacr,但是当我试图将它转换为数据帧时,不确定索引在哪里df作为我想要的列要删除这些索引并将第二行设为列,这是我的数据框 我试图删除索引但不工作。 注意:我说 ...

9 如果所有值均相等,则从二维矩阵中删除列和行

我的矩阵/二维数组看起来像这样。 * | * 我想得到这个结果 我想删除所有行/列,如果它们的值都相等。 我的想法是使用一个可以在下面找到的函数,但是我的代码似乎不起作用。 检查X方向的“ 相等性 ”是没有问题的,但是我不知道Y方向有什么问题。 显然,它不能很 ...

10 awk第一行不起作用删除列

我正在尝试使用以下代码从文件的所有行中删除第26号以外的列: 它在所有行中都运行良好,但对于第一个行,它显示了另外两个字段(并将最后两个字段切成两半)。 我的代码有什么问题吗? 非常感谢 ...

2014-03-03 11:06:43 3 85   awk
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM