Redimensionnement et étirement d'un tableau NumPy

je travaille en Python et j'ai un num Py array comme ceci:

[1,5,9]
[2,7,3]
[8,4,6]

Comment puis-je l'étirer à quelque chose comme ce qui suit?

[1,1,5,5,9,9]
[1,1,5,5,9,9]
[2,2,7,7,3,3]
[2,2,7,7,3,3]
[8,8,4,4,6,6]
[8,8,4,4,6,6]

ce ne sont que quelques exemples de tableaux, je vais en fait redimensionner plusieurs tailles de tableaux, pas seulement ceux-ci.

je suis nouveau à cela, et je ne peux pas sembler enrouler ma tête autour de ce que je dois faire.

21
demandé sur Peter Mortensen 2010-11-19 18:20:34

3 réponses

la réponse de@KennyTM est très habile, et fonctionne vraiment pour votre cas, mais comme une alternative qui pourrait offrir un peu plus de flexibilité pour l'expansion des tableaux essayer np.repeat:

>>> a = np.array([[1, 5, 9],
              [2, 7, 3],
              [8, 4, 6]])

>>> np.repeat(a,2, axis=1)
array([[1, 1, 5, 5, 9, 9],
       [2, 2, 7, 7, 3, 3],
       [8, 8, 4, 4, 6, 6]])

donc, cela accomplit la répétition le long d'un axe, pour l'obtenir le long de plusieurs axes (comme vous pourriez vouloir), tout simplement nicher le np.repeat appels:

>>> np.repeat(np.repeat(a,2, axis=0), 2, axis=1)
array([[1, 1, 5, 5, 9, 9],
       [1, 1, 5, 5, 9, 9],
       [2, 2, 7, 7, 3, 3],
       [2, 2, 7, 7, 3, 3],
       [8, 8, 4, 4, 6, 6],
       [8, 8, 4, 4, 6, 6]])

vous pouvez également varier le nombre de répétitions pour n'importe quelle ligne ou colonne initiale. Par exemple, si vous voulez deux répétitions de chaque ligne en dehors de la dernière rang:

>>> np.repeat(a, [2,2,1], axis=0)
array([[1, 5, 9],
       [1, 5, 9],
       [2, 7, 3],
       [2, 7, 3],
       [8, 4, 6]])

Ici quand le second argument est un list il spécifie une ligne (rows dans ce cas parce que axis=0) se répète pour chaque ligne.

22
répondu dtlussier 2010-11-19 16:46:37
>>> a = numpy.array([[1,5,9],[2,7,3],[8,4,6]])
>>> numpy.kron(a, [[1,1],[1,1]])
array([[1, 1, 5, 5, 9, 9],
       [1, 1, 5, 5, 9, 9],
       [2, 2, 7, 7, 3, 3],
       [2, 2, 7, 7, 3, 3],
       [8, 8, 4, 4, 6, 6],
       [8, 8, 4, 4, 6, 6]])
12
répondu kennytm 2010-11-19 15:28:53

malheureusement numpy ne permet pas les pas fractionnaires (autant que je sache). Voici une solution de contournement. Ce n'est pas aussi intelligent que la solution de Kenny, mais il fait usage de l'indexation traditionnelle:

>>> a = numpy.array([[1,5,9],[2,7,3],[8,4,6]])
>>> step = .5
>>> xstop, ystop = a.shape
>>> x = numpy.arange(0,xstop,step).astype(int)
>>> y = numpy.arange(0,ystop,step).astype(int)
>>> mg = numpy.meshgrid(x,y)
>>> b = a[mg].T
>>> b
array([[1, 1, 5, 5, 9, 9],
       [1, 1, 5, 5, 9, 9],
       [2, 2, 7, 7, 3, 3],
       [2, 2, 7, 7, 3, 3],
       [8, 8, 4, 4, 6, 6],
       [8, 8, 4, 4, 6, 6]])

(la solution de dtlussier est meilleure)

1
répondu Paul 2010-11-19 16:53:21