NumPy构造一个没有rowi的新矩阵,columnj保持行,列索引

时间:2014-11-02 19:56:40

标签: python numpy matrix pandas

我有一个大小为m * n的矩阵(m行和n列)。位置(i,j)处有一个单元格,我想构建一个大小为(m-1)*(n-1)的新矩阵,其中新矩阵不包括单元所在的行和列,并保留原始索引。

例如,我的输入矩阵是这样的:

    1    2    3    4
1   a11  a12  a13- a14
2   a21- a22- a23* a24-
3   a31  a32  a33- a34
4   a41  a42  a43- a44

(* a23旁边的*表示它是给定元素,其旁边带有破折号的元素将在输出中删除)

鉴于(i,j)说(2,3),我希望我的输出为:

    1    2    4
1   a11  a12  a14
3   a31  a32  a34
4   a41  a42  a44

这是我在NumPy中尝试过的:

def myfunction(mymatrix=bipartite, row_idx=0, column_idx=0):
    row_indices = range(mymatrix.shape[0])
    row_indices.remove(row_idx)
    column_indices = range(mymatrix.shape[1])
    column_indices.remove(column_idx)
    result = mymatrix[np.ix_(row_indices, column_indices)]
    return result

print bipartite

print myfunction(bipartite, 2, 3)

[[1 0 1 0 0]
 [1 0 0 1 0]
 [0 1 0 1 0]
 [0 1 0 0 1]
 [0 0 1 0 1]]
[[1 0 1 0]
 [1 0 0 0]
 [0 1 0 1]
 [0 0 1 1]]

然而,在新矩阵中,我丢失了原始列和行索引。

任何人都可以帮助我吗?

或者我甚至没有参加大会,因为Numpy中的矩阵无法保留行和列名称,我必须在DataFrame中使用Pandas来模拟在那种情况下矩阵?

2 个答案:

答案 0 :(得分:1)

如果你想保留任何索引信息,它在Pandas中可能是最简单的。您可以通过在读入数组后删除相关的行/列来完成此操作。

例如:

>>> M = np.random.rand((4, 4))
>>> df = pd.DataFrame(M)
>>> df
          0         1         2         3
0  0.826425  0.888413  0.320257  0.079322
1  0.637170  0.144950  0.370768  0.967574
2  0.674793  0.995937  0.683142  0.403560
3  0.388024  0.619652  0.948890  0.088462

删除行1和列2

>>> df.drop(1, axis=0).drop(2, axis=1)
          0         1         3
0  0.826425  0.888413  0.079322
2  0.674793  0.995937  0.403560
3  0.388024  0.619652  0.088462

答案 1 :(得分:0)

import numpy as np
def minor(arr, i, j):
    # ith column, jth row removed
    return arr[np.array(range(i)+range(i+1, arr.shape[0]))[:,np.newaxis],
               np.array(range(j)+range(j+1,arr.shape[1]))]

arr = np.arange(16).reshape(4,4)
print(arr)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]
#  [12 13 14 15]]

print(minor(arr, 2, 3))

产量

[[ 0  1  2]
 [ 4  5  6]
 [12 13 14]]