Использование numpy where для возврата элемента в той же строке, но в другом столбце

#python #numpy #where-clause

#python #numpy #where-предложение

Вопрос:

Я пытаюсь использовать np.where для замены одного элемента на другой в той же строке (но в другом столбце).

Вот что у меня есть до сих пор:

 arr = np.random.random_integers(0,10,size=(10,10))
split = np.random.random_integers(0,10,size=arr[1,:].shape)
newloc = np.random.random_integers(0,10,size=arr[1,:].shape)
arr2 = np.where(arr>split,arr[0,newloc],arr)
 

Моя проблема в том, что 0 в arr[0,newloc] означает, что он всегда извлекается из строки 0 из arr. Но я хочу что-то вроде «same_row», если это имеет смысл.

Комментарии:

1. newloc это массив, что вы собираетесь здесь делать: arr[0,newloc] ?

2. извините за ошибку, должно быть arr[0,newloc[same_col_asarr]] , я просто не знаю, как это сделать. Моя цель в основном состоит в том, чтобы, если: arr> split, вернуть другой элемент в той же строке, что и arr, местоположение которого хранится в newloc.

Ответ №1:

Я думаю, что вы ищете arr[:, newloc] . Это позволит вам индексировать arr вторую ось (т. Е. Столбцы) newloc значениями.

 np.where(arr > split, arr[:, newloc], arr)
 

Вот пример с двумя строками:

 >> arr = np.random.randint(0, 10, size=(2,10))
>> split = np.random.randint(0, 10, size=arr.shape[1])
>> newloc = np.random.randint(0, 10, size=arr.shape[1])

>> arr
array([[2, 3, 0, 0, 1, 4, 6, 5, 1, 9],
       [9, 2, 6, 3, 2, 6, 3, 6, 2, 5]])

>> split
array([5, 7, 3, 5, 1, 6, 0, 8, 8, 6])

>> newloc
array([1, 7, 0, 5, 0, 7, 3, 6, 4, 8])

>> np.where(arr > split, 1, 0) # mask
array([[0, 0, 0, 0, 0, 0, 1, 0, 0, 1],
       [1, 0, 1, 0, 1, 0, 1, 0, 0, 0]])

>> np.where(arr > split, arr[:, newloc], -1)
array([[-1, -1, -1, -1, -1, -1,  0, -1, -1,  1],
       [ 2, -1,  9, -1,  9, -1,  3, -1, -1, -1]])
 

Там вы можете проверить, правильно ли заменяются столбцы.


Я использовал np.random.randint приведенный выше фрагмент, поскольку np.random.random_integers он устарел.