Python 3.x получает нечетные столбцы на матрице - PullRequest
0 голосов
/ 18 октября 2018

Я работаю с Python 3.7, и я хотел бы получить все нечетные столбцы матрицы.

Чтобы привести пример, у меня есть матрица 4x4 этого стиля прямо сейчас.

[[0, 9, 1, 6], [0, 3, 1, 5], [0, 2, 1, 7], [0, 6, 1, 2]]

То есть ...

0 9 1 6
0 3 1 5
0 2 1 7
0 6 1 2

И я хотел бы получить:

9 6
3 5
2 7
6 2

Числа и размер матрицы изменятся, но структура всегда будет

[[0, (int), 1, (int), 2...], [0, (int), 1, (int), 2 ...], [0, (int), 1, (int), 2...], [0, (int), 1, (int), 2...], ...]

Чтобы получить строки, я могу сделать [:: 2], но это замечательное решение сейчас не работает для меня.Я пытаюсь получить доступ к матрице с помощью:

for i in matrix:
    for j in matrix:

Но ничего из этого тоже не работает.Как я могу решить это?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Если по какой-либо причине вы не можете использовать NumPy, напишите пользовательскую реализацию:

def getColumns(matrix, columns):
    return {c: [matrix[r][c] for r in range(len(matrix))] for c in columns}

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

M = [[0, 9, 1, 6],
    [0, 3, 1, 5],
    [0, 2, 1, 7], 
    [0, 6, 1, 2]]

Все нечетные столбцы являются четными индексами (потому что индекс первого равен 0), следовательно:

L = list(range(0, len(M[0]), 2))

И затемвы бы сделали:

myColumns = getColumns(M, L)
print(list(myColumns.values()))
#result: [[0, 0, 0, 0], [1, 1, 1, 1]]

Но так как вы показали значения, как если бы они были в строках:

def f(matrix, columns):
    return [[matrix[row][i] for i in columns] for row in range(len(matrix))]
print(f(M, L))
#result: [[0, 1], [0, 1], [0, 1], [0, 1]]

И я считаю, что последнее это то, что выхотел.

0 голосов
/ 18 октября 2018

Не используя numpy, вы можете использовать нечто похожее на вашу схему индексации ([1::2]) в понимании списка:

>>> [i[1::2] for i in mat]
[[9, 6], [3, 5], [2, 7], [6, 2]]

Используя numpy, вы можете сделать что-то похожее:

>>> import numpy as np
>>> np.array(mat)[:,1::2]
array([[9, 6],
       [3, 5],
       [2, 7],
       [6, 2]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...