Такое поведение, которое вы ищете, необычно. Вы должны объяснить, зачем вам это нужно. Если вы хотите, чтобы что-то легко выросло, используйте Python list
. numpy
массивы имеют фиксированный размер. Значения могут быть присвоены массиву различными способами, но для его увеличения необходимо создать новый массив с некоторой версией concatenate
. (Да, есть функция / метод resize
, но это обычно не используется.)
Я проиллюстрирую варианты назначения значений:
Начальный массив с известным размером. В вашем случае 5 может быть больше ожидаемого, а 4 - это желаемое количество «столбцов».
In [1]: arr = np.zeros((5,4), dtype=int)
In [2]: arr
Out[2]:
array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]])
Назначить 4 значения одной строке:
In [3]: arr[0] = [1,2,3,4]
Назначить 3 значения, начинающиеся в данной точке на плоском виде массива:
In [4]: arr.flat[4:7] = [1,2,3]
In [5]: arr
Out[5]:
array([[1, 2, 3, 4],
[1, 2, 3, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]])
Этот массив, хотя и определен как (5,4) форма, может рассматриваться как (20,) 1d массив. Мне пришлось выбрать соответствующие значения срезов в плоском представлении.
Чаще всего мы присваиваем значения блоку строк (или множеству других индексированных областей). arr[2:, :]
- это (3,4) часть arr
. Поэтому нам нужно присвоить ему массив (3,4) (или эквивалентную структуру списка). Чтобы получить все преимущества такого рода заданий, вам нужно прочитать broadcasting
.
In [6]: arr[2:,:] = np.reshape(list(range(10,22)),(3,4))
In [7]: arr
Out[7]:
array([[ 1, 2, 3, 4],
[ 1, 2, 3, 0],
[10, 11, 12, 13],
[14, 15, 16, 17],
[18, 19, 20, 21]])
In [8]: arr.ravel()
Out[8]:
array([ 1, 2, 3, 4, 1, 2, 3, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20, 21])