Инициализируйте массив numpy определенной формы c - PullRequest
0 голосов
/ 30 марта 2020

Я хочу инициализировать массив numpy определенной формы c так, чтобы при добавлении к нему чисел он "заполнялся" этой формой.

Длина массива будет варьироваться - и это нормально, я не против, сколько это будет - но я хочу, чтобы он имел 4 столбца. Идеально что-то похожее на следующее:

array = np.array([:, 4])
print(array)
array = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

Опять фактическая длина массива не будет определена. Таким образом, если бы я добавил другой массив, он бы работал следующим образом

test_array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
array = np.append(array, test_array)
print(array)
array = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]

Есть ли способ сделать это?

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Если я хорошо понимаю вашу проблему, я думаю, вам не нужно инициализировать ваш массив. Сначала вы должны проверить, что размер вашего массива делится на 4.

import numpy as np

l = test_array.shape[0]
cols = 4
rows = l / cols
my_array = np.reshape(test_array, (rows, cols))
0 голосов
/ 30 марта 2020

Такое поведение, которое вы ищете, необычно. Вы должны объяснить, зачем вам это нужно. Если вы хотите, чтобы что-то легко выросло, используйте 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...