#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
он устарел.