Добавить массив NumPy в массив NumPy
У меня есть numpy_array. Что-то вроде [ a b c ]
.
И затем я хочу добавить его в другой массив NumPy (так же, как мы создаем список списков). Как создать массив массивов NumPy, содержащих массивы NumPy?
Я попытался сделать следующее без везения
>>> M = np.array([])
>>> M
array([], dtype=float64)
>>> M.append(a,axis=0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'append'
>>> a
array([1, 2, 3])
Ответы
Ответ 1
In [1]: import numpy as np
In [2]: a = np.array([[1, 2, 3], [4, 5, 6]])
In [3]: b = np.array([[9, 8, 7], [6, 5, 4]])
In [4]: np.concatenate((a, b))
Out[4]:
array([[1, 2, 3],
[4, 5, 6],
[9, 8, 7],
[6, 5, 4]])
или это:
In [1]: a = np.array([1, 2, 3])
In [2]: b = np.array([4, 5, 6])
In [3]: np.vstack((a, b))
Out[3]:
array([[1, 2, 3],
[4, 5, 6]])
Ответ 2
Ну, в сообщении об ошибке говорится все: массивы NumPy не имеют метода append()
. Там есть бесплатная функция numpy.append()
:
numpy.append(M, a)
Это создаст новый массив вместо мутирования M
. Обратите внимание, что использование numpy.append()
включает в себя копирование обоих массивов. Вы получите более эффективный код, если используете массивы NumPy фиксированного размера.
Ответ 3
Вы можете использовать numpy.append()
...
import numpy
B = numpy.array([3])
A = numpy.array([1, 2, 2])
B = numpy.append( B , A )
print B
> [3 1 2 2]
Это не приведет к созданию двух отдельных массивов, но добавит два массива в одномерный массив.
Ответ 4
Свен сказал все, просто будьте очень осторожны из-за автоматической настройки типа при вызове append.
In [2]: import numpy as np
In [3]: a = np.array([1,2,3])
In [4]: b = np.array([1.,2.,3.])
In [5]: c = np.array(['a','b','c'])
In [6]: np.append(a,b)
Out[6]: array([ 1., 2., 3., 1., 2., 3.])
In [7]: a.dtype
Out[7]: dtype('int64')
In [8]: np.append(a,c)
Out[8]:
array(['1', '2', '3', 'a', 'b', 'c'],
dtype='|S1')
Как вы видите на основе содержимого, dtype перешел от int64 к float32, а затем к S1
Ответ 5
На самом деле всегда можно создать обычный список массивов numpy и преобразовать его позже.
In [1]: import numpy as np
In [2]: a = np.array([[1,2],[3,4]])
In [3]: b = np.array([[1,2],[3,4]])
In [4]: l = [a]
In [5]: l.append(b)
In [6]: l = np.array(l)
In [7]: l.shape
Out[7]: (2, 2, 2)
In [8]: l
Out[8]:
array([[[1, 2],
[3, 4]],
[[1, 2],
[3, 4]]])
Ответ 6
Я нашел эту ссылку, когда искал что-то немного другое, как начать добавлять объекты массива к пустому массиву, но пробовал все решения на этой странице безрезультатно.
Тогда я нашел этот вопрос и ответ: Как добавить новую строку в пустой массив NumPy
Суть здесь:
Способ "запустить" нужный вам массив:
arr = np.empty((0,3), int)
Затем вы можете использовать concatenate для добавления строк следующим образом:
arr = np.concatenate( ( arr, [[x, y, z]]), axis=0)
Смотрите также https://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html.
Ответ 7
Если я понимаю ваш вопрос, здесь один из способов. Скажите, что у вас есть:
a = [4.1, 6.21, 1.0]
поэтому здесь некоторый код...
def array_in_array(scalarlist):
return [(x,) for x in scalarlist]
Что приводит к:
In [72]: a = [4.1, 6.21, 1.0]
In [73]: a
Out[73]: [4.1, 6.21, 1.0]
In [74]: def array_in_array(scalarlist):
....: return [(x,) for x in scalarlist]
....:
In [75]: b = array_in_array(a)
In [76]: b
Out[76]: [(4.1,), (6.21,), (1.0,)]
Ответ 8
У меня была та же проблема, и я не мог прокомментировать ответ @Sven Marnach (недостаточно реп, черт возьми, я помню, когда Stackoverflow впервые начал...) в любом случае.
Добавление списка случайных чисел в матрицу 10 X 10.
myNpArray = np.zeros([1, 10])
for x in range(1,11,1):
randomList = [list(np.random.randint(99, size=10))]
myNpArray = np.vstack((myNpArray, randomList))
myNpArray = myNpArray[1:]
Используя np.zeros(), массив создается с 1 x 10 нулями.
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
Затем создается список из 10 случайных чисел с использованием np.random и присваивается randomList. Цикл складывает это 10 высоко. Мы просто должны помнить, чтобы удалить первую пустую запись.
myNpArray
array([[31., 10., 19., 78., 95., 58., 3., 47., 30., 56.],
[51., 97., 5., 80., 28., 76., 92., 50., 22., 93.],
[64., 79., 7., 12., 68., 13., 59., 96., 32., 34.],
[44., 22., 46., 56., 73., 42., 62., 4., 62., 83.],
[91., 28., 54., 69., 60., 95., 5., 13., 60., 88.],
[71., 90., 76., 53., 13., 53., 31., 3., 96., 57.],
[33., 87., 81., 7., 53., 46., 5., 8., 20., 71.],
[46., 71., 14., 66., 68., 65., 68., 32., 9., 30.],
[ 1., 35., 96., 92., 72., 52., 88., 86., 94., 88.],
[13., 36., 43., 45., 90., 17., 38., 1., 41., 33.]])
Итак, в функции:
def array_matrix(random_range, array_size):
myNpArray = np.zeros([1, array_size])
for x in range(1, array_size + 1, 1):
randomList = [list(np.random.randint(random_range, size=array_size))]
myNpArray = np.vstack((myNpArray, randomList))
return myNpArray[1:]
массив 7 x 7 с использованием случайных чисел 0 - 1000
array_matrix(1000, 7)
array([[621., 377., 931., 180., 964., 885., 723.],
[298., 382., 148., 952., 430., 333., 956.],
[398., 596., 732., 422., 656., 348., 470.],
[735., 251., 314., 182., 966., 261., 523.],
[373., 616., 389., 90., 884., 957., 826.],
[587., 963., 66., 154., 111., 529., 945.],
[950., 413., 539., 860., 634., 195., 915.]])