Numpy ndarray в цикле for не меняется

avatar
Benny
8 августа 2021 в 19:04
99
1
0

У меня проблема с numpy ndarrays в цикле. По сути, у меня есть две матрицы, b и c, и мне нужно сгенерировать некоторую матрицу a, которая совпадает с b, однако она имеет 0, когда элементы c превышают некоторые пороговые значения, которые собраны в списке x.

Похоже, что этот простой код действительно работает только для первой итерации, но я не могу понять, почему.

b = np.random.rand(3,2)
c = np.random.rand(3,2)

x = [0.5, 0.6, 0.7]
for i in x:
   a = b
   a[np.where(c >= i)] = 0

Редактировать: вот распечатка того, что я получаю

b: [[0.48514708 0.12340482]
 [0.84212494 0.63737198]
 [0.72264245 0.39808082]] 

c: [[0.54775772 0.35079886]
 [0.87601791 0.18765178]
 [0.47789123 0.60977198]]

i=0.5 
 [[0.         0.12340482]
 [0.         0.63737198]
 [0.72264245 0.        ]] 

i=0.6 
 [[0.         0.12340482]
 [0.         0.63737198]
 [0.72264245 0.        ]] 

i=0.7 
 [[0.         0.12340482]
 [0.         0.63737198]
 [0.72264245 0.        ]] 

Все результирующие a-матрицы равны. Наоборот я ожидал

i=0.6 
 [[0.48514708 0.12340482]
 [0.          0.63737198]
 [0.72264245  0.]]

i=0.7
[[0.48514708 0.12340482]
 [0.         0.63737198]
 [0.72264245 0.39808082]] 

Источник
hpaulj
8 августа 2021 в 20:30
0

a=b не делает ничего существенного. Этот цикл изменяет b, а не его копию.

Benny
9 августа 2021 в 11:18
0

Но я не хочу, чтобы b менялось. Итак, как я могу установить для каждой итерации цикла копию b, чтобы изменялась копия, а не b?

Ответы (1)

avatar
Benny
10 августа 2021 в 13:42
0

Как сказал @hpaulj, строка a=b на самом деле ничего не делает, и цикл изменяет b, а не ее копию. Таким образом, просто изменив строку

a=b

с

a = np.copy(b)

решает проблему.