Изменить размерность матрицы без использования NumPy
Без использования NumPy изменить размерность матрицы
Без использования NumPy изменить размерность матрицы. Например из матрицы 2*3 должна получится.
Операции с массивами без использования NumPy
Вопрос такой, с NumPy я смогу это сделать, но а если нету этого модуля на пк, то как решить.
Изменить размерность массива без потери данных
Что нужно использовать для того чтобы изменить размерность массива, без потери данных. т.е. .
Изменить размерность матрицы
Помогите пожалуйста, подскажите как сделать так, чтобы размерность матрицы была не вложенной, а.
Матрицы (без модуля NumPy)
В каждом столбце матрицы вещественных чисел P(k*m) заменить минимальный элемент суммой.
![]()
7279 / 4102 / 1794
Регистрация: 27.03.2020
Сообщений: 6,926
киберум,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
a = [[i*6 + j for j in range(6)] for i in range(6)] for row in a: print(row) cols = int(input('новое количество элементов в строке: ')) n = len(a) * len(a[0]) rows = n//cols + (n%cols > 0) res = [] for row in range(rows): res.append([]) for col in range(cols): i, j = divmod(row*cols + col, len(a)) if row*cols + col > n-1: break res[row].append(a[i][j]) print(res[row])
Изменение формы массивов, добавление и удаление осей
На предыдущем занятии мы немного познакомились со способами изменения формы массивов пакета NumPy, то есть изменением их размерностей. На этом занятии поближе рассмотрим эту тему и познакомимся с наиболее употребительными функциями и свойствами, влияющих на представление массивов.
Изменение размерности массивов
Предположим, у нас имеется массив, состоящий из десяти чисел:
a = np.arange(10) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Мы уже знаем, что для изменения формы этого массива, достаточно указать свойству shape кортеж с новыми размерами, например, так:
a.shape = 2, 5 # массив размерностью 2x5
В результате изменится представление массива, на которое ссылается переменная a. Если же требуется создать новое представление массива, сохранив прежнее, то следует воспользоваться методом reshape():
b = a.reshape(10) # массив [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
И, как мы с вами говорили на предыдущем занятии, ссылки b и a будут использовать одни и те же данные, то есть, изменение массива через b:
b[0] = -1
приведет к изменению соответствующего элемента массива a:
array([[-1, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9]])
Об этом всегда следует помнить. Также следует помнить, что у свойства shape и метода reshape() размерность должна охватывать все элементы массива. Например, вот такая команда:
a.shape = 3, 3
приведет к ошибке, т.к. размерность 3×3 = 9 элементов, а в массиве 10 элементов. Здесь всегда должно выполняться равенство:
n1 x n2 x … x nN = число элементов массива
Но допускается делать так:
a.shape = -1, 2 # размерность 5x2
Отрицательное значение -1 означает автоматическое вычисление размерности по первой оси. По второй берется значение 2. В этом случае получим размерность 5×2.
То же самое можно делать и в методе reshape():
b.reshape(-1, 1) # размерность 10x1 b.reshape(1, -1) # размерность 1x10
Обратите внимание, в последних двух случаях мы получаем представления двумерных массивов, преобразуя одномерный. Это важный момент, так как на выходе метода reshape() получается матрица с двумя осями (строки и столбцы), тогда как изначально массив b имел только одну ось. Не случайно последнее представление отображается с двумя квадратными скобками:
array([[-1, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
Первая скобка – это первая ось (строка), а вторая скобка (вторая ось) описывает столбцы. Одномерный же массив b отображается с одной квадратной скобкой:
array([-1, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Используя отрицательный индекс, можно делать и такие преобразования:
b.reshape(2, -1) # размерность 2x5 b.reshape(-1, 2) # размерность 5x2
Первое представление (2×5) отображается следующим образом:
array([[-1, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9]])
Здесь снова мы видим две квадратные скобки (значит, массив двумерный). Первая описывает ось axis0, отвечающую за строки, а вложенные скобки описывают вторую ось axis1, отвечающую за столбцы.
Если нам требуется многомерный массив преобразовать в обычный одномерный, то можно воспользоваться методом ravel(), который возвращает новое представление, не меняя текущего:
c = b.ravel() # с ссылается на одномерное представление массива
Если же нам нужно текущий массив преобразовать в одномерный, то это можно сделать так:
b.shape = -1
Помимо свойства shape можно использовать метод resize, который выполняет подобную операцию с текущим массивом. Например:
a.resize(2, 5) # массив 2x5
Но, как мы уже говорили, вот такая строчка приведет к ошибке:
a.resize(3, 3) # ошибка: 3x3 != 10
Однако, мы все-таки можем выполнить такую операцию, указав дополнительно флаг refcheck=False:
a.resize(3, 3, refcheck=False) # массив 3x3
a.resize(4, 5, refcheck=False) # массив 4x5
В первом случае происходит удаление одного 10-го элемента, а во втором случае – добавление 4∙5 — 3∙3 = 11 нулей. Это очень удобно, когда нам нужно менять не только форму, но и размер самого массива.
Транспонирование матриц и векторов
Очень часто в математических операциях требуется выполнять транспонирование матриц и векторов, то есть, заменять строки на столбцы. Например, если имеется матрица (двумерный массив):
a = np.array([(1, 2, 3), (1, 4, 9), (1, 8, 27)])
то операция транспонирования может быть реализована так:
b = a.T
Обратите внимание, мы здесь создаем лишь новое представление тех же самых данных массива a. И изменение элементов в массиве b:
b[0, 1] = 10
приведет к соответствующему изменению значения элемента и массива a. Это следует помнить, используя операцию транспонирования.
Транспонирование векторов работает несколько иначе. Предположим, имеется одномерный массив:
x = np.arange(1, 10)
и мы выполняем операцию транспонирования:
В результате ничего не изменилось: вектор как был строкой, так строкой и остался. Почему? Дело в том, что массив x имеет только одну размерность, поэтому здесь нет понятия строк и столбцов. Соответственно, операция транспонирования ни к чему не приводит. Чтобы получить ожидаемый эффект, нужно добавить к массиву еще одну ось, например, так:
x.shape = 1, -1
И теперь, при транспонировании получим вектор-столбец:
x.T # вектор-столбец 9x1
Добавление и удаление осей
- np.expand_dims(a, axis) – добавление новой оси;
- np.squeeze(a[, axis]) – удаление оси (без удаления элементов).
x_test = np.arange(32).reshape(8, 2, 2) # массив 8x2x2
И нам потребовалось добавить еще одно измерение (ось), причем, в самое начало, то есть, ось axis0. Сейчас на этой оси 8 элементов – матриц 2×2, но мы хотим сделать четырехмерный массив, сохранив остальные три оси и их данные без изменений. Как раз это достаточно просто сделать с помощью функции expand_dims, следующим образом:
x_test4 = np.expand_dims(x_test, axis=0)
Обращаясь к свойству shape:
x_test4.shape # (1, 8, 2, 2)
Видим, что массив стал четырехмерным и первая добавленная ось axis0 содержит один элемент – трехмерный массив 8x2x2. При необходимости, мы всегда можем добавить новый элемент на эту ось:
a = np.append(x_test4, x_test4, axis=0) # размерность (2, 8, 2, 2)
или удалить ненужные элементы:
b = np.delete(a, 0, axis=0) # размерность (1, 8, 2, 2)
Здесь второй параметр 0 – индекс удаляемого элемента на оси axis0. Если нам нужно добавить последнюю ось в массиве, то для этого можно записать такую команду:
b = np.expand_dims(x_test4, axis=-1) # размерность (1, 8, 2, 2, 1)
Отрицательный индекс -1 – это следующая с конца ось. Если указать индекс -2, то добавится предпоследняя ось и так далее. Отрицательные индексы очень удобно использовать при работе с массивами произвольных размерностей. Следующая функция squeeze позволяет удалить все оси с одним элементом. Например, строчка:
c = np.squeeze(b) # размерность (8, 2, 2)
превращает массив размерностью (1, 8, 2, 2) в массив размерностью (8, 2, 2). При необходимости, дополнительно мы можем самостоятельно указать оси, которые следует удалять, например, так:
c = np.squeeze(b, axis=0) # удалит только ось axis0, не затронув другие
Но, если указать ось с числом элементов больше 1, то возникнет ошибка:
c = np.squeeze(b, axis=1) # ошибка, на оси axis1 8 элементов
Объект newaxis
В NumPy добавлять новые оси иногда удобнее с помощью специального объекта np.newaxis. Например, пусть у нас есть одномерный массив:
a = np.arange(1, 10) # array([1, 2, 3, 4, 5, 6, 7, 8, 9])
У него одна ось – одно измерение. Добавим еще одну ось, допустим, в начало. С помощью объекта np.newaxis это можно сделать так:
b = a[np.newaxis, :] # добавление оси axis0 b.shape # (1, 9)
Или, можно прописать сразу две оси:
c = a[np.newaxis, :, np.newaxis] c.shape # (1, 9, 1)
Как видите, это достаточно удобная операция.
Видео по теме













© 2023 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта
Как изменить размер массива обрезав ненужные данные?
Конечно же можно использовать транспонирование через 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,173 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
25k 4 4 золотых знака 20 20 серебряных знаков 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,121 3 3 золотых знака 19 19 серебряных знаков 38 38 бронзовых знаков
- python
- numpy
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Без использования NumPy изменить размерность матрицы
Без использования NumPy изменить размерность матрицы. Например из матрицы 2*3 должна получится матрица 1*6, 6*1, 3*2 (т.е равное количество элементов). Элементы исходной матрицы должны быть элементами новой матрицы. Спасибо!
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Изменить размерность матрицы без использования NumPy
Изменить размерность матрицы без использования NumPy. Спасибо!

Операции с массивами без использования NumPy
Вопрос такой, с NumPy я смогу это сделать, но а если нету этого модуля на пк, то как решить.
Изменить размерность массива без потери данных
Что нужно использовать для того чтобы изменить размерность массива, без потери данных. т.е. .
Изменить размерность матрицы
Помогите пожалуйста, подскажите как сделать так, чтобы размерность матрицы была не вложенной, а.
4751 / 2643 / 547
Регистрация: 07.11.2019
Сообщений: 4,359
1 2 3 4
from itertools import chain arr=[[i+j for i in range(4)] for j in range(3)] f=chain(*arr) arr2=[[next(f) for i in range(6)] for j in range(2)]
Регистрация: 17.02.2019
Сообщений: 50
Спасибо большое, а можно эту задачу решить вообще без библиотек, например, только с помощью циклов?
Am I evil? Yes, I am!
![]()
![]()
16120 / 9755 / 2731
Регистрация: 21.10.2017
Сообщений: 21,624
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Матрицы (без модуля NumPy)
В каждом столбце матрицы вещественных чисел P(k*m) заменить минимальный элемент суммой.
Как изменить размерность матрицы
Помогите плз. Мне нужно просграммно поменять размерность матрицы. Например была матрица mat а.
Возведение матрицы в степень без функции и numpy
Добрый день, нужна очень помощь с возведением матрицы в степень, при этом не используя numpy и def.

Найти детерминант квадратной матрицы без numpy.linalg.det
также нельзя использовать никакие функции связаные из numpy. я попытался сделать это таким.
Как умножить 2 матрицы 3×3 по правилам математики без numpy
Здравствуйте, помогите пожалуйста с прогой, нужно умножить матрицу на матрицу без numpy (не.

Ввожу размерность матрицы например 2х3, а в DataTable выходит размерность 2х6. Где ошибка?
void TablClick(object sender, EventArgs e) < DataTable ft = new DataTable(); .
