2016-07-18 3 views
1

я столкнулся странную ошибку в NumPy (?): Учитывая вложенную массив:питон Numpy мутировать выбор

p = np.asarray([[1., 2., 3.], [-4., -5., -6.], [1,2,-4]], dtype=np.float32) 

который

array([[ 1., 2., 3.], 
    [-4., -5., -6.], 
    [ 1., 2., -4.]], dtype=float32) 

я хочу мутировать третью запись массива условно, как

p[p[:, 2] <0][:, 2] *= -1 

Последнее утверждение, однако, не мутирует p. НАДЕЮСЬ для вывода как

array([[ 1., 2., 3.], 
    [-4., -5., 6.], 
    [ 1., 2., 4.]], dtype=float32) 

, но на самом деле это не делает ничего. p остается неизменным. Я проверил много вещей, и я не пришел к выводу, почему p не мутирует.

Конечно, я могу как-то обойти это, но мне это кажется странным. Приветствия и спасибо заранее. Daniel

+0

Обратный порядок ваших квадратных скобок должен исправить, т. Е. 'P [:, 2] [p [:, 2] <0] * = -1'. Булевское индексирование возвращает копию, если вы не выполняете присвоение ей, что вы можете добиться, сделав ее последней операцией индексации. – Jaime

+0

ЭТО ответ на мой вопрос. Я бы отметил это как правильно, если бы мог :) –

+0

Там вы идете, теперь это ответ, который вы можете принять. ;-) – Jaime

ответ

2

реверсивного порядка ваших квадратных скобок следует исправить:

p[:, 2][p[:, 2] < 0] *= -1 

Boolean индексирование возвращает копию, если вы не делаете задание к нему, что вы можете достичь, сделав его последний индексирование.

0

Вы изменили копию исходного массива. Если вы хотите, чтобы мутировать исходный массив, вы должны использовать что-то вроде этого:

p[p[:, 2] <0, 2] *= -1 
0

p[boolean_array] возвращает копию, так что вы измените свою копию, но оставить оригинал без изменений. Например, вы можете использовать np.where. Что-то вроде p[:,2] = np.where(p[:,2], p[:,2], -p[:,2])

Смежные вопросы