Как задать размер массива?

Задать размер массива
Здравствуйте! Подскажите пожалуйста, как создать размер массива N с рандомными числами, где N.
Как задать размер гистограммы?
Доброго времени суток. Вопрос. В питоне получаю гистограмму, но она маленькая по размеру, даже.
Как задать размер виджета в процентах?
Доброго времени суток, пусть есть виджет: Код Python: class MyWidget(Widget): pass .
Как задать размер окна консоли (Windows)?
Хочу что-бы при запуске кода в консоли, окно консоли принимало статичный указанный размер в.
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
Начнем с того, что среди стандартных типов данных в питоне нет массивов.
Регистрация: 04.12.2014
Сообщений: 11
=) спасибо за помощь, кажется я разобрался
Можно сделать так
1 2 3 4
k=(int(input("vvedte razmernost massiva k="))) a=np.arange(k) for i in range(k) a[i]=(int(intput("a[",i,"]=")))
![]()
4623 / 2043 / 361
Регистрация: 17.03.2012
Сообщений: 10,116
Записей в блоге: 6
Йоу! Нашёлся новичок, который знает, что такое массивы!
Можно сделать проще:
a=np.zeros(k)
430 / 384 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
Это вообще не нужно. Как гениально написано в подписи dondublon, правильный вопрос — уже половина ответа.
a = [] for _ in range(int(input())): a.append(int(input()))
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
Vtulhu, use list comprehension, Luke.
![]()
4623 / 2043 / 361
Регистрация: 17.03.2012
Сообщений: 10,116
Записей в блоге: 6
Vtulhu, спасибо на добром слове, но как раз в этом вопросе, человеку, видимо, действительно нужен массив, а не список. И со всеми вытекающими, типа выделения памяти заранее.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как задать стоковый размер для всех загружаемых на сайт картинок?
Использую django-ckeditor и bootstrap4, когда загружаю картинку она выходит за рамки контейнера и.

Wx.Panel. Задать максимальный размер
Подскажите, пожалуйста, как растянуть верхнюю панель вниз (см рис.; белая, по центру квадрат), не.
Задать размер и цвет лейбла
здравствуйте, пользуюсь библиотека Tkinter #задать шрифт текста и размер, с помощью параметра font.

Как задать размер массива и сразу же вводить элементы массива?
Походу требуется задать размер массива и сразу же вводить его элементы. Я знаю как это.
Как задать размер массива?
Цель: задать размер массива используемого в приложении func.exe из вне. Чтобы перед каждым запуском.
Как задать размер массива?
Помогите, я только начал изучать Pascal, и вот не могу понять, как мне указать размер массива, если.
Как задать произвольный размер массива
В общем проблема такая, есть задание (написанное каким то недалеким человеком). В нем не указано.
Или воспользуйтесь поиском по форуму:
Руководство по массивам NumPy
Массивы NumPy несколько напоминают списки Python, но в то же время между ними есть много отличий. Для тех, кто не в теме, мы сейчас расскажем, что есть что.
Как видно уже из названия, массивы NumPy это ключевая структура данных всей библиотеки. Кстати, само имя библиотеки это акроним Numeric или Numerical Python.
Создание массива NumPy
Проще всего массив NumPy создать из списка Python.
myPythonList = [1,9,8,3]
Преобразование списка в массив NumPy производится при помощи объекта np.array .
numpy_array_from_list = np.array(myPythonList)
Для вывода на экран результата просто наберем:
numpy_array_from_list
Output:
array([1, 9, 8, 3])
На практике эти операции можно объединить в одну:
a = np.array([1,9,8,3])
Примечание: в документации Python для создания массива используется метод np.ndarray() . Однако описанный нами метод также является рекомендованным.
Таким же образом массив NumPy может быть создан и из кортежа.
Математические операции с массивами
Для массивов NumPy определены все основные арифметические операции: сложение, умножение, вычитание и деление. Синтаксис тоже обычный: имя массива, а за ним оператор(+, *, — , /)
Пример:
numpy_array_from_list + 10
Output:
array([11, 19, 18, 13])
В результате данной операции к каждому элементу массива прибавилось число 10.
Размерность массивов
Размерность массива можно определить с помощью объекта shape , написав его сразу после имени массива. Таким же образом, с помощью dtype , можно определить тип массива.
import numpy as np a = np.array([1,2,3]) print(a.shape) print(a.dtype) (3,) int64
Тип integer не может содержать значений с плавающей запятой. Поэтому если вы создаете массив с такими значениями, его тип будет float .
#### Different type b = np.array([1.1,2.0,3.2]) print(b.dtype) float64
Двумерные массивы
Размерность можно добавить с помощью запятой. Обратите внимание, что все это должно быть в квадратных скобках [] .
### 2 dimension c = np.array([(1,2,3), (4,5,6)]) print(c.shape) (2, 3)
Трехмерные массивы
Массивы высших размерностей можно создавать следующим образом:
### 3 dimension d = np.array([ [[1, 2,3], [4, 5, 6]], [[7, 8,9], [10, 11, 12]] ]) print(d.shape) (2, 2, 3)
Заключение
В этой главе мы рассмотрели функцию для создания массивов — array([1,2,3]) , а также функцию для вывода размерности массива — array([.]).shape .
Переформатирование, изменение формы — Python: Numpy-массивы
Часто разработчикам приходится изменять размеры массивов. Например, переформатировать исходные данные, чтобы разделить их на подмассивы. В некоторых случаях требуется еще и объединять многомерные данные в единый массив значений. Чтобы решать такие задачи, массивы numpy.ndarray предоставляют набор методов, самым популярным из которых является метод reshape() .
В этом уроке разберем, как работать с размерами массивов numpy.ndarray и как получать их производные. Еще поговорим об ограничениях размерности и узнаем, как они помогают оптимизировать работу.
Как изменить размер массива
Представим, что нам нужно увеличить размер массива numpy.ndarray . Для этого будем идти по следующим шагам:
- Узнаем размер массива и индексы вдоль оси
- Изменим размер массива
Рассмотрим каждый этап подробнее.
Как узнать размер массива и индексы вдоль оси
Чтобы изменить размер numpy.ndarray , нужно узнать его значение. Для этого используют атрибут shape :
import numpy as np one_dimension_array = np.array( [0,1,2,3,4,5,6,7,8,9,10,11] ) print(one_dimension_array.shape) # => (12,) two_dimensions_array = np.array( [ [0,1,2], [3,4,5], [6,7,8], [9,10,11] ] ) print(two_dimensions_array.shape) # => (4, 3) three_dimensions_array = np.array( [ [ [0,1], [2,3], ], [ [4,5], [6,7], ], [ [8,9], [10,11] ] ] ) print(three_dimensions_array.shape) # => (3, 2, 2)
В примере выше атрибут shape возвращает кортеж целых чисел. Длина кортежа указывает на размерность массива:
- (12,) — одномерный массив
- (4, 3) — двумерный массив
- (3, 2, 2) — трехмерный массив
Числа в кортеже означают количество элементов по конкретной оси индексов:
- (12,) — 12 значений
- (4, 3) — четыре блока значений по три значения в каждом
- (3, 2, 2) — три блока значений, каждый из которых состоит из двух блоков по два значения
Название ось индексов отсылает к декартовой системе координат. Вспомним ее основные правила:
- Чтобы построить отрезок или другой одномерный объект, достаточно одной координатной оси
- Чтобы построить квадрат или другой двумерный объект, необходима координатная плоскость из двух перпендикулярных осей
- Чтобы построить куб или другой трехмерный объект, нужно три ортогональные оси координат
Теперь, когда мы знаем размер исходного массива, можно изменять его форму. Для этого используем метод reshape() .
Как изменить размер массива с помощью метода reshape()
В Python используется метод reshape() , с помощью которого можно получить двухмерный и трехмерный массив из одномерного. Этот обязательный параметр ожидает новый размер данных, к которому нужно переформатировать исходный массив.
Попробуем получить двумерный массив two_dimensions_array из одномерного массива one_dimension_array . Для этого используем метод reshape() с новым размером данных (4, 3) :
print(one_dimension_array.reshape((4, 3))) # => [[ 0 1 2] # [ 3 4 5] # [ 6 7 8] # [ 9 10 11]]
Чтобы получить трехмерный массив three_dimensions_array , достаточно также указать нужный размер:
print(one_dimension_array.reshape((3, 2, 2))) # => [[[ 0 1] # [ 2 3]] # [[ 4 5] # [ 6 7]] # [[ 8 9] # [10 11]]]
Изменять форму массива можно не только от данных меньшей размерности к данным большей размерности. Это можно делать и в обратную сторону.
Попробуем получить исходный одномерный массив one_dimension_array из двумерного массива two_dimensions_array :
print(two_dimensions_array.reshape((12,))) # => [ 0 1 2 3 4 5 6 7 8 9 10 11]
А тут переформатируем three_dimensions_array в two_dimensions_array :
print(three_dimensions_array.reshape((4,3))) # => [[ 0 1 2] # [ 3 4 5] # [ 6 7 8] # [ 9 10 11]]
Необязательно уменьшать размер последовательно. Например, можно из трехмерного массива получить сразу одномерный:
print(three_dimensions_array.reshape((12,))) # => [ 0 1 2 3 4 5 6 7 8 9 10 11]
С помощью атрибута shape можно узнать размерность массива numpy.ndarray . А метод reshape поможет ее уменьшить или увеличить. Однако у этого массива есть ограничения по размеру данных — его нужно соблюдать, чтобы оптимизировать выполнения методов над массивами.
Какие размеры массива допустимы
У массива numpy.ndarray есть ограничения по размеру данных — по осям индексов должны быть данные одного размера. Это ограничение позволяет оптимизировать выполнения методов над массивами. Рассмотрим на примере.
Допустим, нам нужно сконвертировать список из списков длиной три и два:
np.array( [ [0,1,2], [3,4,], ] ) # => [list([0, 1, 2]) list([3, 4])]
На первый взгляд у нас получился массив numpy.ndarray . Но если внимательно посмотреть на элементы, мы увидим, что получились списки, а не ожидаемые целочисленные массивы. Это ограничит дальнейшую работу с данными, потому что поведение многих методов меняется.
Попробуем найти в данном массиве максимальный элемент 4 . Это приведет к такому результату:
print(np.array( [ [0,1,2], [3,4,], ] ).max()) # => [3, 4]
В этом примере мы получили не тот результат, которого ожидали.
Numpy старается предотвращать некорректные действия — для этого в нем есть система предупреждений и подсказок. Но это не значит, что не нужно следить за размером массива. Он играет важную роль в реализации методов библиотеки Numpy, поэтому рекомендуем обращать внимание на этот момент.
В случае с методом reshape() Numpy вообще не дает совершить некорректную конвертацию массива из 12 элементов в массив из 15 элементов — три блока по пять значений. В этом случае он вызывает исключение:
one_dimension_array.reshape(3,5) # => ValueError: cannot reshape array of size 12 into shape (3,5)
Ограничения по размеру могут добавить неудобств, когда мы увеличиваем или уменьшаем размерность массива. При этом они позволяют не указывать некоторые значения размера, когда мы хотим его изменить.
Как сделать автоматический расчет размера массива
Ограничения на размер массива позволяют не указывать некоторые размеры в методе reshape() . Это можно оставить на автоматический расчет. Для этого нужное значение размерности поменяем на -1 :
print(one_dimension_array.reshape((4,3))) print(one_dimension_array.reshape(((4, -1)))) print(one_dimension_array.reshape(((-1, 3)))) # => [[ 0 1 2] # [ 3 4 5] # [ 6 7 8] # [ 9 10 11]]
Все преобразования в примере выше дают одинаковый результат. Необходимый размер рассчитывается автоматически, исходя из количества элементов.
Для массивов большей размерности это работает по такому же принципу:
print(one_dimension_array.reshape((3, 2, 2))) print(one_dimension_array.reshape((-1, 2, 2))) print(one_dimension_array.reshape((3, -1, 2))) print(one_dimension_array.reshape((3, 2, -1))) # => [[[ 0 1] # [ 2 3]] # [[ 4 5] # [ 6 7]] # [[ 8 9] # [10 11]]]
Чтобы получить одномерный массив и использовать автоматический расчет, не нужно находить количество элементов. Строки в примере ниже дают одинаковый результат:
print(three_dimensions_array.reshape((12,))) print(three_dimensions_array.reshape((-1,))) # => [ 0 1 2 3 4 5 6 7 8 9 10 11]
Теперь вы знаете, как определять размерность массива. Вы умеете изменять размер и рассчитывать его автоматически. Чтобы закрепить знания на практике, рассмотрим еще один пример.
Как размер массива меняется на практике
Изменение формы массива помогает подготовить исходные данные — после такой обработки их будет удобнее анализировать и преобразовывать.
Представим сервис платформы продаж, который логирует данные по сетевым магазинам в конце рабочего дня в определенном порядке. Аналитики выгрузили данные из закрытого контура платформы. Так они получили 24 значения недельных продаж сети:
orders = [7, 1, 7, 8, 4, 2, 4, 5, 3, 5, 2, 3, 8, 12, 8, 7, 15, 11, 13, 9, 21, 18, 17, 21, 25, 16, 25, 17,] shops_number = 4 orders_matrix = np.array(orders) orders_matrix = orders_matrix.reshape(-1, shops_number) print(orders_matrix) # => [[ 7 1 7 8] # [ 4 2 4 5] # [ 3 5 2 3] # [ 8 12 8 7] # [15 11 13 9] # [21 18 17 21] # [25 16 25 17]] print(orders_matrix.shape) # => (7, 4)
Полученный массив данных можно визуализировать в виде такой таблицы:
| День | Магазин №1 | Магазин №2 | Магазин №3 | Магазин №4 |
|---|---|---|---|---|
| 0 | 7 | 1 | 7 | 8 |
| 1 | 4 | 2 | 4 | 5 |
| 2 | 3 | 5 | 2 | 3 |
| 3 | 8 | 12 | 8 | 7 |
| 4 | 15 | 11 | 13 | 9 |
| 5 | 21 | 18 | 17 | 21 |
| 6 | 25 | 16 | 25 | 17 |
Выводы
Метод shape — важный атрибут для структурного описания массива numpy.ndarray . Он помогает узнать размер вдоль каждой оси.
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
Как изменить размер массива обрезав ненужные данные?
Конечно же можно использовать транспонирование через zip :
from pprint import pprint arr = [[0, 0, 0,0, 0, 0,0, 0, 0], [0, 0, 0,0, 0, 0,0, 0, 0], [0, 0, 3,5, 6, 7,0, 0, 0], [0, 1, 1,1, 1, 1,7, 0, 0], [0, 7, 1,1, 1, 1,1, 7, 0], [0, 7, 1,1, 1, 1,1, 7, 0], [0, 7, 1,1, 1, 1,7, 0, 0], [0, 0, 7,7, 7, 7,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], [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]] pprint(list(zip(*filter(any, zip(*filter(any, arr)))))) # [(0, 3, 5, 6, 7, 0, 0), # (1, 1, 1, 1, 1, 7, 0), # (7, 1, 1, 1, 1, 1, 7), # (7, 1, 1, 1, 1, 1, 7), # (7, 1, 1, 1, 1, 7, 0), # (0, 7, 7, 7, 7, 0, 0)]
- filter(any, arr) — отсеиваем строки, состоящие из нулей
- zip(*filter(any, arr)) — транспонируем матрицу из оставшихся строк
- filter(any, zip(*filter(any, arr))) — аналогично первому пункту, но уже на транспонированной матрице (отсеиваем строки, которые раньше были столбцами)
- zip(*filter(any, zip(*filter(any, arr)))) — транспонируем обратно
Отслеживать
ответ дан 26 мар 2020 в 12:07
user207200 user207200
5,210 8 8 золотых знаков 23 23 серебряных знака 41 41 бронзовый знак
Можно воспользоваться методом numpy.nonzero(), возвращающим индексы ненулевых элементов по каждой размерности / оси:
nz = np.nonzero(arr) res = arr[nz[0].min():nz[0].max()+1, nz[1].min():nz[1].max()+1]
In [19]: res Out[19]: array([[0, 3, 5, 6, 7, 0, 0], [1, 1, 1, 1, 1, 7, 0], [7, 1, 1, 1, 1, 1, 7], [7, 1, 1, 1, 1, 1, 7], [7, 1, 1, 1, 1, 7, 0], [0, 7, 7, 7, 7, 0, 0]])
Отслеживать
ответ дан 26 мар 2020 в 14:04
MaxU — stand with Ukraine MaxU — stand with Ukraine
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака
Только к верней границе +1, она же исключающая! nz[0].max() + 1 и nz[1].max() + 1 .
26 мар 2020 в 14:11
@mkkik, да совсем вылетело из головы, спасибо!
26 мар 2020 в 17:46
Воспользуйтесь функционалом numpy :
import numpy as np arr = np.array([[0, 0, 0,0, 0, 0,0, 0, 0], [0, 0, 0,0, 0, 0,0, 0, 0], [0, 0, 3,5, 6, 7,0, 0, 0], [0, 1, 1,1, 1, 1,7, 0, 0], [0, 7, 1,1, 1, 1,1, 7, 0], [0, 7, 1,1, 1, 1,1, 7, 0], [0, 7, 1,1, 1, 1,7, 0, 0], [0, 0, 7,7, 7, 7,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], [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]])
res = arr[~np.all(arr == 0, axis=1)] res = res[:, ~np.all(res == 0, axis=0)] print(res)
[[0 3 5 6 7 0 0] [1 1 1 1 1 7 0] [7 1 1 1 1 1 7] [7 1 1 1 1 1 7] [7 1 1 1 1 7 0] [0 7 7 7 7 0 0]]
Отслеживать
ответ дан 26 мар 2020 в 12:10
25.5k 4 4 золотых знака 21 21 серебряный знак 36 36 бронзовых знаков
~np.all(arr == 0, axis=1) можно заменить на метод any -> arr.any(axis=1)
26 мар 2020 в 12:33
@strawdog ответ хороший, потому что можно ввести любое значение non data
26 мар 2020 в 14:18
def v_trim_array(multi_array): zero_index = None for index in range(len(multi_array[0])): flag = False for array in multi_array: if array[index]: flag = True if zero_index is not None: array[zero_index] = array[index] if flag: zero_index += 1 else: if zero_index is None: zero_index = index for array in reversed(multi_array): del array[zero_index:] def h_trim_array(multi_array): zero_index = None for index, array in enumerate(multi_array): if any(array): if zero_index is not None: multi_array[zero_index] = array zero_index += 1 else: if zero_index is None: zero_index = index del multi_array[zero_index:] multi_array = [ [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 3, 5, 6, 7, 0, 0, 0], [0, 1, 1, 1, 1, 1, 7, 0, 0], [0, 7, 1, 1, 1, 1, 1, 7, 0], [0, 7, 1, 1, 1, 1, 1, 7, 0], [0, 7, 1, 1, 1, 1, 7, 0, 0], [0, 0, 7, 7, 7, 7, 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], [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] ] # сначала убираем нулевые строки (по горизонтали) h_trim_array(multi_array) # затем убираем нулевые столбцы (по вертикали) v_trim_array(multi_array) for array in multi_array: print(' '.join(map(str, array))) # 0 3 5 6 7 0 0 # 1 1 1 1 1 7 0 # 7 1 1 1 1 1 7 # 7 1 1 1 1 1 7 # 7 1 1 1 1 7 0 # 0 7 7 7 7 0 0
Отслеживать
ответ дан 26 мар 2020 в 11:02
6,151 3 3 золотых знака 19 19 серебряных знаков 38 38 бронзовых знаков
- python
- numpy
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.17.3574