Как я могу создать массив / матрицу NxM, используя numpy из элементов списка - PullRequest
1 голос
/ 30 апреля 2020

У меня есть файл, состоящий из следующих чисел

AAFF
ADFF
7689
7FAD
AAFF
ADFF
7689
7FAD
... and so on for 200 lines of the file

Я хочу создать 2 матрицы, используя numpy. матрица 1 будет иметь строки 8 и столбец 1 (при этом будут использоваться первые 8 строк данных из файла), матрица 2 будет иметь форму 8x8 (при этом будут использоваться следующие 64 строки данных из файла)

Сейчас я сохранил числа в списке и использовал функцию для создания матрицы 1. Как это сделать, используя numpy?

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

def createMatrix(rowCount, colCount, dataList):   
    mat = []
    for i in range (rowCount):
        rowList = []
        for j in range (colCount):
            if dataList[j] not in mat:
                rowList.append(dataList[i])
        mat.append(rowList)

    return mat

Могу ли я изменить эту функцию для создания матрицы 8x8? Или это будет проще в numpy?

1 Ответ

1 голос
/ 30 апреля 2020

Вы можете создать простой массив из списка и изменить его форму:

import numpy as np
import random

random.seed(42)

d = "0123456789ABCDEF"

data = [''.join(random.choices(d, k = 4)) for _ in range(72)]

print(data)

first8, next64 = data[:8],data[8:8+64]

farr = np.array(first8)

arr = np.array(next64).reshape( (8,8)) 

print(farr)
print(arr)

Вывод:

# random data
['A043', 'BAE1', '6038', '03A8', '39C0', 'CB52', 'F511', 'D9CB', '8F68', 'D9D9', 
 'B034', '1314', 'A553', '4EA9', '2B26', 'FA8A', 'DC30', '543F', 'E5A6', 'E743', 
 '849E', '63F8', '101A', 'C616', 'F8FD', '0BA8', '4A16', '7FE4', '82ED', '4A92', 
 'C8C8', '050E', 'ED40', 'EF17', '1CC2', '784D', '638B', '34FA', '7813', '5933', 
 '1A3E', 'D13A', '32E9', '7CC3', '1667', 'BAF1', '65D3', '3764', '3E7D', '80FD', 
 'FED2', '7360', '6F4C', '76FF', '8B24', 'F98B', '098D', '2F12', '9A31', 'E399', 
 '698E', '3B36', 'A45C', '17FF', '134E', 'EE52', 'DB9F', 'A0D4', 'AF21', '1849',
 'B3A4', '7ED1']

# arrays from first 8
['A043' 'BAE1' '6038' '03A8' '39C0' 'CB52' 'F511' 'D9CB']

# array reshaped to (8,8)
[['8F68' 'D9D9' 'B034' '1314' 'A553' '4EA9' '2B26' 'FA8A']
 ['DC30' '543F' 'E5A6' 'E743' '849E' '63F8' '101A' 'C616']
 ['F8FD' '0BA8' '4A16' '7FE4' '82ED' '4A92' 'C8C8' '050E']
 ['ED40' 'EF17' '1CC2' '784D' '638B' '34FA' '7813' '5933']
 ['1A3E' 'D13A' '32E9' '7CC3' '1667' 'BAF1' '65D3' '3764']
 ['3E7D' '80FD' 'FED2' '7360' '6F4C' '76FF' '8B24' 'F98B']
 ['098D' '2F12' '9A31' 'E399' '698E' '3B36' 'A45C' '17FF']
 ['134E' 'EE52' 'DB9F' 'A0D4' 'AF21' '1849' 'B3A4' '7ED1']]

Вы можете сделать то же самое с обычными python списками и нет numpy вообще:

# skip first 8 - then take slices of size 8 from the original list
plain = [ data[8+i:8+i+8] for i in range(0,64,8)]
print(plain)

[['8F68', 'D9D9', 'B034', '1314', 'A553', '4EA9', '2B26', 'FA8A'], 
 ['DC30', '543F', 'E5A6', 'E743', '849E', '63F8', '101A', 'C616'], 
 ['F8FD', '0BA8', '4A16', '7FE4', '82ED', '4A92', 'C8C8', '050E'], 
 ['ED40', 'EF17', '1CC2', '784D', '638B', '34FA', '7813', '5933'], 
 ['1A3E', 'D13A', '32E9', '7CC3', '1667', 'BAF1', '65D3', '3764'], 
 ['3E7D', '80FD', 'FED2', '7360', '6F4C', '76FF', '8B24', 'F98B'], 
 ['098D', '2F12', '9A31', 'E399', '698E', '3B36', 'A45C', '17FF'], 
 ['134E', 'EE52', 'DB9F', 'A0D4', 'AF21', '1849', 'B3A4', '7ED1']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...