Переопределение элементов в массиве Numpy

#python #numpy

#python #numpy

Вопрос:

У меня есть массив из 30 значений, и я хочу добавить эти значения в пустой массив.

Я создал пустой массив numpy и использовал np.append() , чтобы попытаться добавить свои значения в этот пустой массив.

 oldArray = np.empty(30)
diameter = np.sqrt(values)
newArray = np.append(oldArray, [diameter])
  

Я надеялся, что, сделав это, он обновит старый массив и выдаст правильный вывод. Однако, когда я распечатываю newArray , он просто выдает мне значения, сохраненные в oldArray . Есть предложения о том, как на самом деле выполнить эту операцию?

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

1. можете ли вы опубликовать полный код?

2. Это часто всплывает. np.append должен быть предан забвению. Если вы хотите создать объект итеративно, используйте добавление списка. Не пытайтесь имитировать это в массивах numpy.

3. Во-первых, вы не создавали пустой массив, по крайней мере, ничего похожего на список [] . np.empty(30) представляет собой массив из 30 неопределенных значений. С другой стороны, np.append возвращает новый массив, а не модификацию исходного. По крайней мере, вы не предполагали, что это действовало на месте! np.append — это просто неудачно названная обложка для np.concatenate . Это медленнее, чем добавление списка, и его трудно выполнить правильно.

4. newArray = np.sqrt(values) . Нет необходимости добавлять или переопределять значения в другом массиве.

Ответ №1:

для простоты я использовал np.zeros вместо np.empty, потому что он присваивает массиву случайные значения, также я присваиваю значения массиву единиц.

 import numpy as np

values = np.ones(30)
oldArray = np.zeros(30)
diameter = np.sqrt(values)
newArray = np.append(oldArray, [diameter])

print('oldArray= ', oldArray)
print(30*'-')
print('newArray= ', newArray)
  

вывод:

 oldArray=  [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0.]
------------------------------
newArray=  [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
  

Ответ №2:

Я не смог бы смоделировать вашу проблему, если бы использовал значения в виде целых чисел или массива, он всегда присоединяет массив diameter к концу, как и должно быть. Однако, учитывая, что вы новичок и используете пустой массив, я думаю, что вместо этого вы можете попытаться записать значения в этот массив.

Это:

 values = 1
oldArray = np.empty(3)
oldArray[:] = np.sqrt(values)
  

Это дает oldArray, заполненный требуемыми вам значениями, имейте в виду, что это был бы не старый массив, теперь это был бы заполненный новый массив:

 [1. 1. 1.]
  

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

 values = [1, 2]
oldArray = np.empty(3)
oldArray[0: len(values)] = np.sqrt(values)
  

Изменило бы только два значения

 [1. 1.41421 0.]
  

Ниже приведено то, что я попытался смоделировать вашу проблему.

 oldArray = np.empty(3)
print(f"oldArray:{oldArray}, shape:{oldArray.shape}")
values = np.ones(5)
diameter = np.sqrt(values)
newArray = np.append(oldArray, diameter)
print(f"newArray:{newArray}, shape:{newArray.shape}")
  

какой вывод должен:

 oldArray:[2.59338625e 161 6.91119945e 212 5.98157061e-154], shape:(3,)
newArray:[2.59338625e 161 6.91119945e 212 5.98157061e-154 1.00000000e 000
1.00000000e 000 1.00000000e 000 1.00000000e 000 1.00000000e 000], shape:(8,)
  

Ответ №3:

 In [23]: values = np.arange(4)                                                  
  

Если я сгенерирую новый набор значений, я могу просто присвоить его переменной:

 In [24]: arr = np.sqrt(values)                                                  
In [25]: arr                                                                    
Out[25]: array([0.        , 1.        , 1.41421356, 1.73205081])
  

Я мог бы присвоить массиву новые значения, но зачем?

 In [26]: arr[:] = [100,200,300,400]                                             
In [27]: arr                                                                    
Out[27]: array([100., 200., 300., 400.])
  

concatenate позволяет мне объединить несколько массивов — фактически, целый их список:

 In [28]: np.concatenate([arr,arr])                                              
Out[28]: array([100., 200., 300., 400., 100., 200., 300., 400.])
  

Нет необходимости имитировать добавление списка с неправильным именем np.append . Если я должен использовать итерацию (с функцией, которая работает только со скалярами), лучше всего использовать добавление списка:

 In [29]: alist = []                                                             
In [30]: for v in values: 
    ...:     alist.append(v**.5) 
    ...: alist                                                                  
Out[30]: [0.0, 1.0, 1.4142135623730951, 1.7320508075688772]
In [31]: np.array(alist)                                                        
Out[31]: array([0.        , 1.        , 1.41421356, 1.73205081])
In [32]: np.array([v**.5 for v in values])                                      
Out[32]: array([0.        , 1.        , 1.41421356, 1.73205081])