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
с удалением 1-й строки и 2-го столбца:
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 использует так называемую «причудливую» индексацию.Правила для необычной индексации требуют, чтобы форма двух массивов была одинаковой, или, если они не одинаковы, использовать широковещательную передачу для «накачки» форм так, чтобы они совпадали.
Inв этом случае форма второго массива (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]]