我有一个大小为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
来模拟在那种情况下矩阵?
答案 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]]