web-dev-qa-db-fra.com

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

Je pense que mon problème devrait être très simple, mais je ne peux trouver aucune aide Sur Internet, que ce soit. Je suis très nouveau sur Python, il est donc possible que Il me manque quelque chose de très évident.

J'ai un tableau, S, comme ceci [x x x] (one-dimensional). Je crée maintenant une matrice Diagonale, sigma, avec np.diag(S) - jusqu'ici, tout va bien. Maintenant, je veux redimensionner ce nouveau tableau diagonal afin de pouvoir le multiplier par un autre tableau que

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, lorsque j'imprime le contenu de my_sigma, j'obtiens "None". Quelqu'un peut-il s'il vous plaît Me diriger dans la bonne direction, car je ne peux pas imaginer que cela devrait être donc compliqué.

Merci d'avance pour votre 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
hjweide

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

De plus, la fonction shape() renvoie la forme de l'entrée _. Si vous voulez simplement prédéfinir une forme, utilisez simplement 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

Cependant, cela va d'abord aplatir votre tableau d'origine, puis le reconstruire dans la forme donnée, détruisant ainsi le classement d'origine. Si vous voulez simplement "ajouter" des zéros, au lieu d'utiliser resize(), vous pouvez simplement 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
voithos

Il existe une nouvelle fonction numpy dans la version 1.7.0 numpy.pad qui peut le faire en une ligne. Comme pour les autres réponses, vous pouvez construire la matrice diagonale avec np.diag avant le remplissage . Le Tuple ((0,N),(0,0)) utilisé dans cette réponse indique le "côté" de la matrice à remplir. 

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 maintenant égal à:

[[1 0 0]
 [0 2 0]
 [0 0 3]
 [0 0 0]
 [0 0 0]
 [0 0 0]]
53
Hooked

Je vois l'édition ... vous devez d'abord créer les zéros, puis y insérer des nombres. np.diag_indices_from pourrait vous être utile

bigger_sigma = np.zeros(shape, dtype=sigma.dtype)
diag_ij = np.diag_indices_from(sigma)
bigger_sigma[diag_ij] = sigma[diag_ij] 
4
Phil Cooper

Cette solution fonctionne avec la fonction resize

Prendre 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.]]

"""

Ceci dosent fonctionne, il suffit d'ajouter une valeur répétée

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.]])
"""

Ceci fonctionne

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.]]
"""
1
Eka

Une autre solution pure en python 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 maintenant

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

c'est une solution hideuse, j'avoue que… .. Cependant, elle illustre certaines fonctions du type list pouvant être utilisées.

0
FraggaMuffin