Есть ли способ, которым я мог бы взять только желаемый индексированный диапазон элементов из каждой строки и столбца в матрице?

#python

#python

Вопрос:

Допустим, у меня есть матрица из 10×10 элементов. Я хочу взять элементы от 0 до 7-го столбца из каждой строки только до 6-й строки и отбросить все остальные. Например:

 [08, 02, 22, 97, 38, 15, 00, 40, 00, 75, 
49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 
81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 
52, 70, 95, 23, 04, 60, 11, 42, 69, 24, 
22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 
24, 47, 32, 60, 99, 03, 45, 02, 44, 75, 
32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 
67, 26, 20, 68, 02, 62, 12, 20, 95, 63, 
24, 55, 58, 05, 66, 73, 99, 26, 97, 17, 
21, 36, 23, 09, 75, 00, 76, 44, 20, 45, 
78, 17, 53, 28, 22 75, 31, 67, 15, 94]  
  

Мне нужны только элементы от 0 до 7-го столбца и от каждой строки до 6-й строки. Вы можете видеть изображение. Эта выбранная часть матрицы — это то, что мне нужно.

Комментарии:

1. как на самом деле хранится эта так называемая «матрица»? Действительно ли это обычный 1-мерный список целых чисел, как кажется здесь?

2. Это недопустимый список Python (у вас есть ints , начинающийся с 0). Кроме того, у вас есть 110 элементов.

3. можете ли вы использовать numpy?

Ответ №1:

Поскольку ваша матрица хранится в одномерном списке, я предполагаю, что у вас есть произвольная переменная ( actual_cols ), которая будет определять количество столбцов, которые может иметь строка. Я также предполагаю, что вы хотите, чтобы извлеченная матрица была сохранена в одномерном списке, аналогичном исходной матрице. Если это так, то вы можете попробовать этот подход:

 a = [8, 2, 22, 97, 38, 15, 00, 40, 0, 75, 
49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 
81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 
52, 70, 95, 23, 4, 60, 11, 42, 69, 24, 
22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 
24, 47, 32, 60, 99, 3, 45, 2, 44, 75, 
32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 
67, 26, 20, 68, 2, 62, 12, 20, 95, 63, 
24, 55, 58, 5, 66, 73, 99, 26, 97, 17, 
21, 36, 23, 9, 75, 0, 76, 44, 20, 45, 
78, 17, 53, 28, 22, 75, 31, 67, 15, 94]

actual_cols = 10
col = 7
row = 6

b = [a[i] for i in range(len(a)) if (i % actual_cols < col) and (i / actual_cols) < row]
print(b)
  

Вы также можете сделать что-то подобное, если хотите сохранить извлеченную матрицу в 2-мерном списке

 a = [8, 2, 22, 97, 38, 15, 00, 40, 0, 75, 
49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 
81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 
52, 70, 95, 23, 4, 60, 11, 42, 69, 24, 
22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 
24, 47, 32, 60, 99, 3, 45, 2, 44, 75, 
32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 
67, 26, 20, 68, 2, 62, 12, 20, 95, 63, 
24, 55, 58, 5, 66, 73, 99, 26, 97, 17, 
21, 36, 23, 9, 75, 0, 76, 44, 20, 45, 
78, 17, 53, 28, 22, 75, 31, 67, 15, 94]

actual_cols = 10
col = 7
row = 6

b = [[a[i*actual_cols   j] for j in range(col)] for i in range(int(len(a)/actual_cols)) if i < row]
print(b)
  

Если вы сохраните исходную матрицу в 2-мерном списке, тогда их будет легче извлечь

 a = [[8, 2, 22, 97, 38, 15, 00, 40, 0, 75],
[49, 49, 99, 40, 17, 81, 18, 57, 60, 87], 
[81, 49, 31, 73, 55, 79, 14, 29, 93, 71], 
[52, 70, 95, 23, 4, 60, 11, 42, 69, 24], 
[22, 31, 16, 71, 51, 67, 63, 89, 41, 92], 
[24, 47, 32, 60, 99, 3, 45, 2, 44, 75], 
[32, 98, 81, 28, 64, 23, 67, 10, 26, 38], 
[67, 26, 20, 68, 2, 62, 12, 20, 95, 63], 
[24, 55, 58, 5, 66, 73, 99, 26, 97, 17], 
[21, 36, 23, 9, 75, 0, 76, 44, 20, 45], 
[78, 17, 53, 28, 22, 75, 31, 67, 15, 94]]

col = 7
row = 6

b = [x[:col] for x in a[:row]]
print(b)
  

Ответ №2:

Мой метод заключается в превращении матрицы в одномерный массив и выборе чисел на основе их положения. КРОМЕ того, этот метод может сохранять формат ваших чисел, такой как «02», потому что я в основном использую методы string и list.

Теперь я предположил, что вы превратили свою матрицу в одномерный массив. Поскольку вам требуются числа, которые попадают в столбцы 0-7 и строки 0-6, вам в основном нужны только столбцы 8/10 и строки 6/11. Это означает, что вы хотели бы повторить только первые 6 * 10 = 60 чисел (10 — длина одной строки), а наша целевая цель — позиции 0-7, 10-17, 20-27…

Проверьте код ниже 3.

 new_l = [] # this is to store all qualified numbers (falling in the requested columns and requested rows)
position_list = list(range(6*10)) # you only want to iterate the first 6 rows, so 60 numbers in total
for i in range(0,60,10):
    line_position_list =position_list[i:i 8] # slice the list into 6 smaller pieces and extract only the first 8 elements.
    for position in line_position_list:
        new_l.append(l[position]) # append these numbers into the new list
print(new_l)

# if you want to keep the shape of array, turn everything to string and then add n at the end of the 7th element
for i in range(0,len(new_l),8):
    new_l[i] = "n"   new_l[i]
print(new_l)
new_string = ",".join(new_l)
print(new_string)

Output

08, 02, 22, 97, 38, 15, 00, 40,
 49, 49, 99, 40, 17, 81, 18, 57,
 81, 49, 31, 73, 55, 79, 14, 29,
 52, 70, 95, 23, 04, 60, 11, 42,
 22, 31, 16, 71, 51, 67, 63, 89,
 24, 47, 32, 60, 99, 03, 45, 02
  

Обновить:
l — это одномерный массив всех элементов со строковым типом:
введите описание изображения здесь

Комментарии:

1. Что делает l [position] в new_l.append(l[position]) ? Вы не определили переменную l

2. @RabinBK извините, что я виноват, l — это одномерный массив ваших элементов строковых типов. Я обновил его в ответе, см. Изображение. Причина, по которой я использую string, заключается в сохранении некоторого вашего числового формата: 02, например.

3. Чтобы получить l из вашей исходной матрицы, вам, вероятно, нужно выполнить некоторый метод разделения строк и замены и объединения. Дайте мне знать, если вам нужен конкретный код. Кроме того, функция new_l.append(l[position]) заключается в добавлении чисел, принадлежащих столбцу 0-7 и строке 0-6, в новый список new_l. Позиция берется из line_position_list , в котором хранятся все позиции, которые попадают в ваши запросы. (line_position_list = [0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13…, 20, 21, 22, …, 27,…, 30, … , 40, …, 50, 51, 52, …,57])