Как пересчитать массив в Python - PullRequest
3 голосов
/ 26 апреля 2011

Я новичок в Python, и у меня есть вопрос о массиве / матрице.Ниже приведена матрица, которую я получил.

A =

[[85 77 83 ..., 59 58 59]

[80 83 80 ..., 57 60 58]

[75 76 81 ..., 59 58 60]]

Я хочу повторить выборку (я не знаю, правильно ли этослово) матрица, чтобы она стала

B =

[[85 85 85 85 77 77 77 77 83 83 83 83 ....... 59 59 59 59 5858 58 58 59 59 59 59]

[85 85 85 85 77 77 77 77 83 83 83 83 ....... 59 59 59 59 58 58 58 58 59 59 59 59]

[85 85 85 85 77 77 77 77 83 83 83 83 ....... 59 59 59 59 58 58 58 58 59 59 59 59]

[85 85 85 85 77 77 77 7777 83 83 83 83 ....... 59 59 59 59 58 58 58 58 59 59 59 59]

[80 80 80 80 83 83 83 83 80 80 80 80 ....... 57 57 57 57 60 60 60 60 58 58 58 58]

[80 80 80 80 83 83 83 83 80 80 80 80 ....... 57 57 57 57 57 60 60 60 60 58 5858 58]

[80 80 80 80 83 83 83 83 80 80 80 80 ....... 57 57 57 57 60 60 60 60 58 58 58 58]

[8080 80 80 83 83 83 83 80 80 80 80 ....... 57 57 57 57 60 60 60 60 58 58 58 58

[75 75 75 75 76 76 76 76 81 81 81 81 ....... 5959 59 59 58 58 58 58 60 60 60 60]

[75 75 75 75 76 76 76 76 81 81 81 81 ....... 59 59 59 59 58 58 58 58 60 60 60 60]

[75 75 75 75 76 76 76 76 81 81 81 81 ....... 59 59 59 59 58 58 58 58 60 60 60 60]]

Я искал в Интернете и просмотрел много сообщений, но все еще не знаю, как это сделать.Поэтому, пожалуйста, научите меня, как это сделать, и я очень признателен.

Ответы [ 4 ]

3 голосов
/ 26 апреля 2011

Определенно используйте информацию из Scipy интерполяции, как изменить размер / изменить размер матрицы 3x3 до 5x5? из комментариев.

Но я подумал, что возиться и вот что я получил:

Возможно, самый худший метод за все время:

>>> import pprint
>>> a = [[85, 77, 99],
...      [11, 22, 33],
...      [44, 55, 66]]
>>> 
>>> def transform(n,matrix):
...     return [item for sublist in [[[item for sublist in [[element]*n for element in row] for item in sublist] for _ in range(n)] for row in matrix] for item in sublist]
... 
>>> pprint.pprint(transform(3,a))
[[85, 85, 85, 77, 77, 77, 99, 99, 99],
 [85, 85, 85, 77, 77, 77, 99, 99, 99],
 [85, 85, 85, 77, 77, 77, 99, 99, 99],
 [11, 11, 11, 22, 22, 22, 33, 33, 33],
 [11, 11, 11, 22, 22, 22, 33, 33, 33],
 [11, 11, 11, 22, 22, 22, 33, 33, 33],
 [44, 44, 44, 55, 55, 55, 66, 66, 66],
 [44, 44, 44, 55, 55, 55, 66, 66, 66],
 [44, 44, 44, 55, 55, 55, 66, 66, 66]]
>>> pprint.pprint(transform(4,a))
[[85, 85, 85, 85, 77, 77, 77, 77, 99, 99, 99, 99],
 [85, 85, 85, 85, 77, 77, 77, 77, 99, 99, 99, 99],
 [85, 85, 85, 85, 77, 77, 77, 77, 99, 99, 99, 99],
 [85, 85, 85, 85, 77, 77, 77, 77, 99, 99, 99, 99],
 [11, 11, 11, 11, 22, 22, 22, 22, 33, 33, 33, 33],
 [11, 11, 11, 11, 22, 22, 22, 22, 33, 33, 33, 33],
 [11, 11, 11, 11, 22, 22, 22, 22, 33, 33, 33, 33],
 [11, 11, 11, 11, 22, 22, 22, 22, 33, 33, 33, 33],
 [44, 44, 44, 44, 55, 55, 55, 55, 66, 66, 66, 66],
 [44, 44, 44, 44, 55, 55, 55, 55, 66, 66, 66, 66],
 [44, 44, 44, 44, 55, 55, 55, 55, 66, 66, 66, 66],
 [44, 44, 44, 44, 55, 55, 55, 55, 66, 66, 66, 66]]
>>> pprint.pprint(transform(5,a))
[[85, 85, 85, 85, 85, 77, 77, 77, 77, 77, 99, 99, 99, 99, 99],
 [85, 85, 85, 85, 85, 77, 77, 77, 77, 77, 99, 99, 99, 99, 99],
 [85, 85, 85, 85, 85, 77, 77, 77, 77, 77, 99, 99, 99, 99, 99],
 [85, 85, 85, 85, 85, 77, 77, 77, 77, 77, 99, 99, 99, 99, 99],
 [85, 85, 85, 85, 85, 77, 77, 77, 77, 77, 99, 99, 99, 99, 99],
 [11, 11, 11, 11, 11, 22, 22, 22, 22, 22, 33, 33, 33, 33, 33],
 [11, 11, 11, 11, 11, 22, 22, 22, 22, 22, 33, 33, 33, 33, 33],
 [11, 11, 11, 11, 11, 22, 22, 22, 22, 22, 33, 33, 33, 33, 33],
 [11, 11, 11, 11, 11, 22, 22, 22, 22, 22, 33, 33, 33, 33, 33],
 [11, 11, 11, 11, 11, 22, 22, 22, 22, 22, 33, 33, 33, 33, 33],
 [44, 44, 44, 44, 44, 55, 55, 55, 55, 55, 66, 66, 66, 66, 66],
 [44, 44, 44, 44, 44, 55, 55, 55, 55, 55, 66, 66, 66, 66, 66],
 [44, 44, 44, 44, 44, 55, 55, 55, 55, 55, 66, 66, 66, 66, 66],
 [44, 44, 44, 44, 44, 55, 55, 55, 55, 55, 66, 66, 66, 66, 66],
 [44, 44, 44, 44, 44, 55, 55, 55, 55, 55, 66, 66, 66, 66, 66]]
>>> 
2 голосов
/ 26 апреля 2011

Следующая реализация рекурсивно пересчитывает (дублирует) матрицу или список (любой тип итеративного контейнера), содержащий числа (любые не повторяемые объекты). Это быстрее и намного проще понять, чем другие альтернативы. Он может обрабатывать произвольно вложенные списки. Каждый подсписок правильно копируется.

import itertools

def resample(obj, n):
    try:
        return list(itertools.chain.from_iterable((resample(row, n) for c in xrange(n)) for row in obj))
    except TypeError:
        return obj

Использование:

>>> l = [1, 2, 3, 4]
>>> resample(l, 4)
[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4]

>>> m = [[1, 2, 3, 4], [5, 6, 7, 8]]
>>> resample(m, 4)
[[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4],
 [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4],
 [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4],
 [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4],
 [5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8],
 [5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8],
 [5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8],
 [5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8]]
0 голосов
/ 06 мая 2013
import numpy as np
import scipy as sp

# your matrix. Let's say A(3,3) with random values from 0 to 20
A = sp.random.randint(20,size=(3,3))

# Resize as you want (m x n)
m =5
n =5
New_A = sp.kron(A, sp.ones(m,n))

print New_A

Даже немного поздно для ответа, я предпочел дать некоторые комментарии к нему!

0 голосов
/ 26 апреля 2011

Я не совсем понял ваш алгоритм или что вы хотите сделать, но:

a=[[1,2],[3,4]]
# grow horizontally, 5 times
b=[[c for d in zip(x,x,x,x,x) for c in d] for x in a]
# grow vertically, 5 times
c= [z[:] for x in ((y[:],y[:],y[:],y[:],y[:]) for y in b) for z in x]

Обратите внимание, что он работает с массивами чего угодно, поскольку использует только базовые языковые примитивы

...