In [34]: arr=np.random.random((4,4))
In [35]: arr
Out[35]:
array([[ 0.00750932, 0.47917318, 0.39813503, 0.11755234],
[ 0.30330724, 0.67527229, 0.71626247, 0.22526589],
[ 0.5821906 , 0.2060713 , 0.50149411, 0.0328739 ],
[ 0.42066294, 0.88529916, 0.09179092, 0.39389844]])
这给出了的未成年人arr,删除了第一行和第二列:
In [36]: arr[np.array([0,2,3])[:,np.newaxis],np.array([0,1,3])]
Out[36]:
array([[ 0.00750932, 0.47917318, 0.11755234],
[ 0.5821906 , 0.2060713 , 0.0328739 ],
[ 0.42066294, 0.88529916, 0.39389844]])
因此,您可以使用以下方式:
def minor(arr,i,j):
# ith row, jth column removed
return arr[np.array(list(range(i))+list(range(i+1,arr.shape[0])))[:,np.newaxis],
np.array(list(range(j))+list(range(j+1,arr.shape[1])))]
关于它是如何工作的:
注意索引数组的形状:
In [37]: np.array([0,2,3])[:,np.newaxis].shape
Out[37]: (3, 1)
In [38]: np.array([0,1,3]).shape
Out[38]: (3,)
的使用[:,np.newaxis]只是使第一个数组的形状为(3,1)。
由于这些是numpy数组(而不是切片),因此numpy使用所谓的“花式”索引。花式索引的规则要求两个数组的形状相同,或者在它们不相同时,使用广播“抽出”形状,以便它们确实匹配。
在这种情况下,第二个数组的形状(3,)被抽至(1,3)。但是(3,1)和(1,3)不匹配,因此(3,1)被抽至(3,3),而(1,3)被抽至(3,3)。
啊,最后,两个numpy数组(在广播之后)具有相同的形状(3,3)。
Numpy获取arr[<array of shape (3,3)>, <array of shape (3,3)>]
并返回一个形状数组(不足为奇)(3,3)。
返回数组的第(i,j)个元素将是
arr[(i,j)-th element of first array, (i,j)-th element of second array]
第一个数组和第二个数组在概念上看起来像这样:
first array: second array:
[[0 0 0], [[0, 1, 3],
[2 2 2], [0, 1, 3],
[3 3 3]] [0, 1, 3]]