Несколько одинаковых значений словаря в массиве изменяется при изменении одного из значений - PullRequest
1 голос
/ 04 марта 2020

Допустим, я выполняю некоторую операцию над массивом следующим образом:

>>arr = np.array([1,2,34,567,433243,787,832])
>>h = np.where(arr < 100, {'hello' : 1}, {'hi' : 2 })
array([{'hello': 1}, {'hello': 1}, {'hello': 1}, {'hi': 2}, {'hi': 2},{'hi': 2}, {'hi': 2}], dtype=object)

Когда я пытаюсь добавить пару ключ-значение по некоторым выборочным индексам, он реплицируется по всем индексам и дает мне что-то вроде этого:

>>h[0]['hola']=12
>>h[4]['heyy']=11
>>h
array([{'hello': 1, 'hola': 12}, {'hello': 1, 'hola': 12},{'hello': 1, 'hola': 12}, {'hi': 2, 'heyy': 11},{'hi': 2, 'heyy': 11}, {'hi': 2, 'heyy': 11},{'hi': 2, 'heyy': 11}], dtype=object)

В то время как я ожидаю, что значения изменятся только с этими указанными c индексами (0 и 4) и получат что-то вроде этого:

array([{'hello': 1, 'hola': 12}, {'hello': 1}, {'hello': 1}, {'hi': 2}, {'hi': 2, 'heyy': 11}, {'hi': 2,}, {'hi': 2}], dtype=object)

Как получить желаемый результат? Заранее спасибо

1 Ответ

1 голос
/ 04 марта 2020

вы передаете 3 аргумента в np.where условие выражение, если оно истинно, и выражение, если оно ложно. Эти выражения оцениваются перед передачей в метод where. Таким образом, когда dicts создаются один раз для true и один раз для false, один и тот же dict будет использоваться всякий раз, когда это булево значение встречается в выражении.

Вы можете просто использовать понимание списка, чтобы достичь того, что вы хотите.

h = np.array([{'hello': 1} if i < 100 else {'hi': 2} for i in arr])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...