Python: redimensionner un tableau existant et le remplir de zéros

je pense que mon problème doit être vraiment simple, mais je ne peux pas trouver l'aide sur l'Internet que ce soit. Je suis très nouveau en Python, donc il est possible que Je suis absent quelque chose de très évident.

j'ai un tableau, S, comme ceci [x x x] (one-dimensional). Je vais maintenant créer un matrice diagonale, sigmanp.diag(S) - pour l'instant, tout va bien. Maintenant, je veux redimensionnez ce nouveau tableau diagonal de sorte que je puisse le multiplier par un autre tableau qui J'ai.

import numpy as np
...
shape = np.shape((6, 6)) #This will be some pre-determined size
sigma = np.diag(S) #diagonalise the matrix - this works
my_sigma = sigma.resize(shape) #Resize the matrix and fill with zeros - returns "None" - why?

cependant, quand j'imprime le contenu my_sigma, j'obtiens "None". Quelqu'un peut-il svp me pointer dans la bonne direction, parce que je ne peux pas imaginer que cela devrait être tellement compliqué.

Merci d'avance pour toute aide!

Casper

Graphique:

j'ai ceci:

[x x x]

je veux ceci:

[x 0 0]
[0 x 0]
[0 0 x]
[0 0 0]
[0 0 0]
[0 0 0] - or some similar size, but the diagonal elements are important.
24
demandé sur borgr 2012-02-12 22:54:26

5 réponses

sigma.resize() retourne None parce qu'il fonctionne sur place. np.resize(sigma, shape), d'autre part, renvoie le résultat, mais au lieu de remplir avec des zéros, il rembourre avec des répétitions du tableau.

aussi, le shape() la fonction renvoie la forme de l'entrée. Si vous voulez juste pour prédéfinir une forme, il suffit d'utiliser un tuple.

import numpy as np
...
shape = (6, 6) #This will be some pre-determined size
sigma = np.diag(S) #diagonalise the matrix - this works
sigma.resize(shape) #Resize the matrix and fill with zeros

Toutefois, ce sera d'abord aplatir votre tableau d'origine, puis le reconstruire dans le shape, détruisant l'ordre original. Si vous voulez juste "pad" avec des zéros, au lieu d'utiliser resize() vous pouvez juste indexer directement dans une matrice zéro générée.

# This assumes that you have a 2-dimensional array
zeros = np.zeros(shape, dtype=np.int32)
zeros[:sigma.shape[0], :sigma.shape[1]] = sigma
18
répondu voithos 2012-02-12 19:55:24

Il y a une nouvelle fonction numpy dans la version 1.7.0 numpy.pad qui peut faire cela en une seule ligne. Comme les autres réponses, on peut construire la matrice diagonale avec np.diag avant le remplissage. The tuple ((0,N),(0,0)) utilisé dans cette réponse indique que le "côté" de la matrice, à la map.

import numpy as np

A = np.array([1, 2, 3])

N = A.size
B = np.pad(np.diag(A), ((0,N),(0,0)), mode='constant')

B est égal à:

[[1 0 0]
 [0 2 0]
 [0 0 3]
 [0 0 0]
 [0 0 0]
 [0 0 0]]
52
répondu Hooked 2013-05-06 14:50:08

je vois le modifier... vous devez d'abord créer les zéros, puis déplacer des nombres. np.diag_indices_from peut-être être utile pour vous

bigger_sigma = np.zeros(shape, dtype=sigma.dtype)
diag_ij = np.diag_indices_from(sigma)
bigger_sigma[diag_ij] = sigma[diag_ij] 
4
répondu Phil Cooper 2012-02-12 20:11:19

une autre solution Python pure est

a = [1, 2, 3]
b = []
for i in range(6):
    b.append((([0] * i) + a[i:i+1] + ([0] * (len(a) - 1 - i)))[:len(a)])

b est

[[1, 0, 0], [0, 2, 0], [0, 0, 3], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

c'est une solution hideuse, Je l'admets. Cependant, il illustre certaines fonctions du list type peut être utilisé.

0
répondu FraggaMuffin 2017-03-05 12:57:01

Cette solution fonctionne avec resize function

prélever un échantillon de tableau

S= np.ones((3))
print (S)
# [ 1.  1.  1.]
d= np.diag(S) 
print(d)
"""
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]

"""

dosent travail, il suffit d'ajouter un à répéter les valeurs

np.resize(d,(6,3))
"""
adds a repeating value
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])
"""

d.resize((6,3),refcheck=False)
print(d)
"""
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]
 [ 0.  0.  0.]
 [ 0.  0.  0.]
 [ 0.  0.  0.]]
"""
0
répondu Eka 2017-09-25 11:36:31