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, sigma
np.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.
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
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]]
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]
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é.
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.]]
"""