#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])