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