Diziden sayıya matris


149

Numpy kullanıyorum. 1 sütun ve N satır içeren bir matris var ve ben N elemanları ile bir dizi almak istiyorum.

Örneğin, eğer varsa M = matrix([[1], [2], [3], [4]]), almak istiyorum A = array([1,2,3,4]).

Bunu başarmak için kullanıyorum A = np.array(M.T)[0]. Aynı sonucu almanın daha zarif bir yolunu bilen var mı?

Teşekkürler!


Ivnerse Question: 2D
Tobias Kienzler

Yanıtlar:


192

Biraz daha okunabilir bir şey istiyorsanız, bunu yapabilirsiniz:

A = np.squeeze(np.asarray(M))

Aynı şekilde, şunları da yapabilirsiniz: A = np.asarray(M).reshape(-1)ancak bu okunması biraz daha kolay.


9
Benim açımdan çok az rant ... numpy'nin neden ayrı varlıklar olarak dizileri ve matrisleri var. Çok unpythonic IMHO. Bu ipucu için teşekkürler @Joe.
Naijaba

6
@Naijaba - Değeri için, matris sınıfı etkili bir şekilde (ancak resmi olarak değil) amortismana tabi tutulur. Çoğunlukla tarihi amaçlar için orada. Çıkarma numpy.matrixtartışmalı bir konunun biraz olmakla numpy Devs çok ikisine birden sahip nedenlerden bir bütün ana için unpythonic ve rahatsız edici olduğunu size katılıyorum. Ancak, eski, bakımsız kod kullanan "vahşi" kodunu matrixtamamen kaldırılmasını zorlaştırır.
Joe Kington

1
Bahsetmemek gerekirse, gerçek matris çarpımı sadece Numpy 1.10'daki diziler için eklenmiştir ve temelde hala betadadır. Bu, birçok insanın (ben dahil) hala istediğimizi yapmak için diziler yerine matrisler kullanması gerektiği anlamına gelir. docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
Georges Oates Larsen

1
Seyrek matrisler, bellek tasarruflu makine öğrenimi için temeldir (örn sklearn.). Aslında , satırlar veya sütunlar aracılığıyla verimli erişim sağlayan farklı sparse matrixtürler vardır scipy. Bunun matris ve dizi kavramlarını birleştirmek için bir sorun olabileceğini düşünüyorum. Bununla birlikte, bir sparse arraytür de getirilip getirilemeyeceğini ve bunu yapmak için herhangi bir plan olup olmadığını merak ediyorum . Herhangi bir ipucu var mı?
pms

Ben sonunda 1D dizi istediğiniz sürece .flatten () yanı sıra .squeeze () çalışır.
wordsforthewise

122

6
Bence bu cevap kabul edilen cevaptan, performans açısından ve basitlikten daha iyi
dariush

M.A1 mükemmeldir, "ravel" ve "flatten" ile aynı uygulamadır ve bu durumda herhangi bir veri kopyası A'ya neden olmaz, bu nedenle A ve / veya M değişebilirse sürprizlere neden olabilecek şekilde M ile bağlantılı kalır. M.flat orijinal alternatif dönen "düzleştirici" jeneratör (salt okunur semantik) np.squeeze (M) #, burada da tamam, ancak genel M np.reshape için 1-d boyutlarını kaldıran bir görünüm verir ( M, -1) # genellikle şekil uyumluluğuna bağlı olarak bir görünümdür, bu "-1" A1 / ravel / flatten yapmanın dolambaçlı bir yoludur
jayprich

13
A, = np.array(M.T)

zannederek ne demek istediğine bağlı ama sanırım bu


11

Aşağıdaki varyantı deneyebilirsiniz:

result=np.array(M).flatten()


6

Veya bazı tempslerden kaçınmayı deneyebilirsiniz

A = M.view(np.ndarray)
A.shape = -1

2

İlk olarak, Mv = numpy.asarray(M.T)size 4x1 ancak 2D bir dizi verir.

Sonra, A = Mv[0,:]istediğinizi veren performans . Onları bir araya getirebilirsiniz numpy.asarray(M.T)[0,:].



0

Numpy'nin ravel () ve flatten () işlevleri, burada deneyeceğim iki tekniktir. Joe , Siraj , kabarcık ve Kevad tarafından yapılan gönderilere eklemek isterim .

Ravel:

A = M.ravel()
print A, A.shape
>>> [1 2 3 4] (4,)

Düzleştirmek:

M = np.array([[1], [2], [3], [4]])
A = M.flatten()
print A, A.shape
>>> [1 2 3 4] (4,)

numpy.ravel()dizinin herhangi bir kopyasını almayan kütüphane düzeyinde bir işlev olduğundan daha hızlıdır . Ancak, A dizisindeki herhangi bir değişiklik, kullanıyorsanız orijinal M dizisine geçernumpy.ravel() .

numpy.flatten()daha yavaştırnumpy.ravel() . Ancak numpy.flatten()A oluşturmak için kullanıyorsanız , A'daki değişiklikler orijinal M dizisine taşınmaz .

numpy.squeeze()ve M.reshape(-1)daha yavaş numpy.flatten()ve numpy.ravel().

%timeit M.ravel()
>>> 1000000 loops, best of 3: 309 ns per loop

%timeit M.flatten()
>>> 1000000 loops, best of 3: 650 ns per loop

%timeit M.reshape(-1)
>>> 1000000 loops, best of 3: 755 ns per loop

%timeit np.squeeze(M)
>>> 1000000 loops, best of 3: 886 ns per loop
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.