2012-02-12 21 views
22

benim konu gerçekten basit olması gerektiğini düşünüyorum sıfırlarla doldurmak, henüz herhangi internette herhangi bir yardım bulamıyorum. Python için çok yeniyim, bu yüzden çok açık bir şey eksik.Python: Varolan diziyi yeniden boyutlandırma ve

bu [x x x] (one-dimensional) gibi bir dizi, S, var. Şimdi np.diag(S) ile köşegen matris, sigma oluşturmak - Şimdiye kadar, çok iyi. Ben var başka diziye ile çarpın, böylece Şimdi, boyutlandırmak için bu yeni diyagonal dizi istiyorum. Ben my_sigma içeriğini yazdırırken

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? 

Ancak, ben "None" olsun. doğru yönde Can Birisi lütfen nokta beni, ben bu kadar karmaşık olması gerektiğini hayal bile edemiyorum çünkü. Herhangi bir yardım için şimdiden

teşekkürler! o yerinde faaliyet çünkü

[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. 
+0

Şekil(), diag() ve resize() öğesini tanımlıyor musunuz, yoksa kullandığınız kitaplıktan mı geliyorsunuz? – grieve

+0

resize() numpy kitaplığından, bunu belirtmeliydim. – casper

+0

Bu numpy, değil mi? Eğer doğru bir şekilde anlaşıyorsam, sigma'nın içinde veri var, ama sigma'yı büyütmek ve yeni öğeleri sıfır doldurmak istiyorsun. Bu doğru mu? Yeni bir sıfır doldurulmuş diziye ihtiyacınız varsa, 'numpy.zeros ((6,6))' – gfortune

cevap

17

sigma.resize() döner None:

Casper

Grafiksel:

[x x x] 

Şunu istiyorum:

bu var. np.resize(sigma, shape) Öte yandan, sonuç verir, ancak bunun yerine sıfır ile doldurma , bu dizi tekrarları ile doldurur.

Ayrıca, shape() işlevi, girişinin şeklini döndürür. Bir şekli önceden tanımlamak istiyorsanız, sadece bir tuple kullanın.

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 

Ancak, bu ilk özgün dizi doğrulmak edecek ve ardından orijinal sipariş yok, verilen şeklin içine yeniden. Sıfır ile "pad" yapmak istiyorsanız, resize() kullanmak yerine, doğrudan oluşturulan bir mat matrisine doğrudan indeksleyebilirsiniz.

# This assumes that you have a 2-dimensional array 
zeros = np.zeros(shape, dtype=np.int32) 
zeros[:sigma.shape[0], :sigma.shape[1]] = sigma 
+0

Teşekkürler, bu ihtiyaç duyduğum şeye çok yakın ama şimdi yeni matrisim diyagonalitesini kaybediyor, yani başlangıçta diyagonal olan elemanlar orada kalmıyor. Bunu düzeltmek için bir fikrin var mı? – casper

+0

@Casper: Düzenlememe bakın. – voithos

+0

Teşekkürler! Bu mükemmel, tüm çabalarınız için teşekkürler, voithos! – casper

4

Düzenleme işlemini görüyorum ... önce sıfırları oluşturmanız ve ardından bazı sayıları ona taşımak zorundasınız. Eğer

bigger_sigma = np.zeros(shape, dtype=sigma.dtype) 
diag_ij = np.diag_indices_from(sigma) 
bigger_sigma[diag_ij] = sigma[diag_ij] 
+0

Bu da işe yarıyor gibi görünüyor! Oldukça zor bir süreç olduğunu ve sadece bir şeyi kaçırmadığımı görmekten memnuniyet duyuyorum. – casper

+0

Bunu daha iyi seviyorum. Daha fazla okunabilir ve sadece ihtiyaç duyulan her şeyi ekler. Ayrıca, 'sigma.dtype' kullanmak iyi bir fikirdir. – voithos

+0

Sorunun bağlamı, dikdörtgen matrisin bir SVD'sinin ("full_matrices = True" ile) ve yeniden yapılandırılmasını "A = USV" yapmak olduğunu tahmin ediyorum. Bu durumda, bu tür bir çözümü tercih ederim. – Patrick

48

tek çizgide yapabilirsiniz sürümü 1.7.0 numpy.pad yeni numpy işlevi vardır için np.diag_indices_from yararlı olabilir. Diğer cevaplarda olduğu gibi, dolgudan önce np.diag köşegen matrisi de oluşturabilirsiniz. Bu cevapta kullanılan tuple ((0,N),(0,0)), matrisin pede geçirileceği "tarafını" gösterir.

[[1 0 0] 
[0 2 0] 
[0 0 3] 
[0 0 0] 
[0 0 0] 
[0 0 0]] 
+1

** Güncelleme yanıtı gönderdiğiniz için teşekkürler **. +1'imden önce cevaplarımız bağlandı, ancak benimki 1,7. En iyi cevabı alacağınızdan emin değil, çünkü StackOverflow'un bir "ilk cevap kazanır" yanlılığı var. Yeni bilgi görmek güzel ... –

0

Başka saf piton çözüm

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 şimdi

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

iğrenç bir çözüm bu, ben olacak geçerli:

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 artık eşittir itiraf et şapka. Bununla birlikte, kullanılabilen list türünün bazı işlevlerini gösterir.

0

Bu çözüm

, sadece

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

Bu eser

yapar yinelenen değerler eklemek Bu işi dosent

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

""" 

örnek bir dizi al resize fonksiyonu ile çalışır

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

İlk boyutu değil, ikinci boyutu değiştirirseniz, olmaz – bold

İlgili konular