NumPy dizisini aktarma


193

Python ve NumPy kullanıyorum ve "devrik" ile ilgili bazı sorunlar var:

import numpy as np
a = np.array([5,4])
print(a)
print(a.T)

Çağırma a.Tdiziyi aktarmıyor . Eğer aörneğin bir [[],[]]o doğru transposes ama devriğini ihtiyacım [...,...,...].


aynı fakat olmadan okunamaz değil devrik is ... "baskı a.transpose" denenmiş
thaking

Yanıtlar:


247

Tam olarak olması gerektiği gibi çalışıyor. A devrik 1D dizisi hala olduğunu 1D dizi! (Matlab kullanmaya alışkınsanız, temelde 1D dizisi kavramına sahip değildir. Matlab'ın "1D" dizileri 2D'dir.)

Eğer 2B dizi halinde 1D vektör açmak ve sonra sırasını değiştirmek isterseniz, sadece birlikte bunu dilim np.newaxis(ya Noneda aynıyız, newaxissadece daha fazla okunabilir).

import numpy as np
a = np.array([5,4])[np.newaxis]
print(a)
print(a.T)

Genel olarak konuşmak gerekirse, bunun için endişelenmenize gerek yok. Sadece alışkanlıktan yapıyorsanız ekstra boyut eklemek genellikle istediğiniz şey değildir. Numpy, çeşitli hesaplamalar yaparken otomatik olarak 1D dizisi yayınlayacaktır. Genellikle bir vektör istediğinizde, bir satır vektörü ve bir sütun vektörü (ikisi de vektör değildir . Her ikisi de 2B'dir!) Arasında ayrım yapmaya gerek yoktur .


2
@thaking - Sadece np.arangehızlıca 1D dizisi yapardım . Aynı şekilde çalışır a = np.array([5,4]).
Joe Kington

2
@thaking Numpy'de yeniyseniz - yuvarlak köşeli parantezlerin ()numpy içinde ek bir boyut belirtmediğini unutmayın . Eğer a = np.arange(10)o zaman aolduğu array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])kadar üretilen a.__repr__(). Bu, a.ndim --> 1köşeli parantezlerle gösterildiği gibi 1 boyutlu (yani ) bir vektördür []. array( ... )Ya ne zaman görmedim print(a)ya a.__str__().
dtlussier

7
@JoeKington bir 1D dizi yayın faydalı bir durum var. Bir dizideki tüm 1D noktaları arasındaki mesafeyi hesaplama. Çözümünüz sayesinde mesafe matrisi veren x - x [np.newaxis] .T yapılabilir
JuanPi

4
Şahsen ben bulmak np.vstack()operasyon daha açıkça belirtilmesi amacıyla: print np.vstack(a).
Alexander Pozdneev

2
Sadece matlab değil, aynı zamanda lineer cebir bir satır / sütun vektörü kavramına sahiptir. Numpy, sadece matlab değil, birçok yerden gelen insanlara özgüdür.
eric

135

Bir yerine iki braket çifti kullanın. Bu, bir parantez çifti kullanırsanız oluşturduğunuz 1D dizisinin aksine, aktarılabilen bir 2D dizi oluşturur.

import numpy as np    
a = np.array([[5, 4]])
a.T

Daha kapsamlı bir örnek:

>>> a = [3,6,9]
>>> b = np.array(a)
>>> b.T
array([3, 6, 9])         #Here it didn't transpose because 'a' is 1 dimensional
>>> b = np.array([a])
>>> b.T
array([[3],              #Here it did transpose because a is 2 dimensional
       [6],
       [9]])

shapeBurada neler olduğunu görmek için numpy yöntemini kullanın :

>>> b = np.array([10,20,30])
>>> b.shape
(3,)
>>> b = np.array([[10,20,30]])
>>> b.shape
(1, 3)

11
Bu çözümü [np.newaxis] 'e tercih ederim, daha zarif imo görünüyor.
Mart'ta

Makineler o kadar akıllı değil. Sadece bir karınız olsa bile, ilk karınız olarak ilan edilmelidir.
Sreeragh AR

Bu seçilen cevap olmalı
bruno

79

1D dizileri için :

a = np.array([1, 2, 3, 4])
a = a.reshape((-1, 1)) # <--- THIS IS IT

print a
array([[1],
       [2],
       [3],
       [4]])

Burada -1'in "gerektiği kadar satır" anlamına geldiğini anladıktan sonra, bunu bir diziyi "aktarmanın" en okunabilir yolu olarak görüyorum. Diziniz daha yüksek boyutlara sahipse kullanın a.T.


5
Bunun yalnızca vektörlerle çalıştığını unutmayın. 2 boyutlu diziniz varsa işlemler transposeve reshapediziyi farklı şekillerde değiştirin (elde edilen görüntü şekli aynıdır, ancak öğeler farklı şekilde yerleştirilir).
johndodo

2
Yorumunuz için teşekkürler. Demek istediğim, ama sanırım cevabımı temizlediğinden daha dikkat dağıtıyor çünkü @thaking çerçevelerine tam olarak basit bir tek satırlık çözüm veriyorum. İki boyutlu dizilerle ilgili değil, 1 boyutlu dizilerle ilgili. Elmalar ve armutlar burada.
Ulf Aslak

2
Elbette. Cevabınız bu dava için doğru ve zarif, asla eleştirmek istemedim. Ancak soru başlığı ("NumPy dizisinin aktarılması") verildiğinde, birçok ziyaretçinin buraya daha genel bir çözüm aramaya geleceğinden şüpheleniyorum ve 2D diziler için geçerli olmadığı konusunda onları uyarmak istedim. Aksi takdirde, OP'nin sorusu dikkate alındığında cevabınız doğru ve uygundur.
johndodo

@UlfAslak, lütfen yaklaşımınızı ND dizisi için genelleştirilemez olarak güncelleyin,! Johndodo tarafından önerildiği gibi net olmak her zaman iyidir, böylece kimse tekniğinizi yanlış kullanmamalıdır.!, Burada soru doğru cevap için & astar değil.!
Anu

18

Mevcut bir vektörü fazladan bir köşeli parantez kümesine sararak bir matrise dönüştürebilirsiniz ...

from numpy import *
v=array([5,4]) ## create a numpy vector
array([v]).T ## transpose a vector into a matrix

numpy ayrıca bir matrixsınıfa sahiptir (bkz. dizi vs matris ) ...

matrix(v).T ## transpose a vector into a matrix

14

numpy 1D dizisi -> sütun / satır matrisi:

>>> a=np.array([1,2,4])
>>> a[:, None]    # col
array([[1],
       [2],
       [4]])
>>> a[None, :]    # row, or faster `a[None]`
array([[1, 2, 4]])

@ Joe-kington söylediği gibi, sen yerini alabilir Noneile np.newaxisokunabilmesi için.


10

1d dizisini 2d sütununa 'aktarmak' için şunları kullanabilirsiniz numpy.vstack:

>>> numpy.vstack(numpy.array([1,2,3]))
array([[1],
       [2],
       [3]])

Vanilya listeleri için de çalışır:

>>> numpy.vstack([1,2,3])
array([[1],
       [2],
       [3]])

1
@sandroscodelller, altta yatan koda baktınız vstackmı? np.concatenate([atleast_2d(_m) for _m in tup], 0). Diziyi (1,1) dizilere böler ve bunları birleştirir! Süreçte bir kopya oluşturur, tüm yeniden şekillendirilmiş olanlar bir görünüm oluşturur.
hpaulj

3

Yalnızca bir 2D diziyi devredebilirsiniz. numpy.matrixBir 2D dizi oluşturmak için kullanabilirsiniz . Bu üç yıl gecikti, ancak sadece olası çözümlere ekliyorum:

import numpy as np
m = np.matrix([2, 3])
m.T

Kullanımı np.matrixgerekli değildir ve genellikle cesaret kırılmıştır.
hpaulj



2

Başka bir çözüm.... :-)

import numpy as np

a = [1,2,4]

[1, 2, 4]

b = np.array([a]).T

dizi ([[1], [2], [4]])


Bu çözümün sorunu nedir ?!
omotto

1

Ben sadece yukarıdaki yazıyı birleştiriyorum, umarım başkalarına biraz zaman kazandıracak:

Aşağıdaki dizinin (2, )boyutu vardır, 1 boyutlu bir dizidir,

b_new = np.array([2j, 3j])  

1-B diziyi aktarmanın iki yolu vardır:


"np.newaxis" ile dilimleyin veya hiçbiri.!

print(b_new[np.newaxis].T.shape)
print(b_new[None].T.shape)

başka türlü yazma, yukarıdaki Tişlem olmadan .!

print(b_new[:, np.newaxis].shape)
print(b_new[:, None].shape)

Sarmak [] veya np.matrix kullanmak, yeni bir boyut eklemek anlamına gelir.!

print(np.array([b_new]).T.shape)
print(np.matrix(b_new).T.shape)

0

Yukarıda bahsedilen yorumlardan bazılarında olduğu gibi, 1D dizilerinin devri 1D dizileridir, bu nedenle 1D dizisini transpoze etmenin bir yolu diziyi şöyle bir matrise dönüştürmek olacaktır:

np.transpose(a.reshape(len(a), 1))


0

Bir yöntem yanıtları açıklanan ancak açıklanmayan yoktur belgeler için numpy.ndarray.transposeyöntemiyle:

Bir 1-D dizi için, bunun bir etkisi yoktur, çünkü transpoze edilen bir vektör sadece aynı vektördür. 1-B diziyi 2B sütun vektörüne dönüştürmek için ek bir boyut eklenmesi gerekir. np.atleast2d (a) .T, bunu [:, np.newaxis] gibi başarır.

Biri şunları yapabilir:

import numpy as np
a = np.array([5,4])
print(a)
print(np.atleast_2d(a).T)

Hangi (imo) kullanmaktan daha güzel newaxis.


0

Temel olarak transpoze fonksiyonunun yaptığı, dizinin şeklini ve adımlarını değiştirmektir:

>>> a = np.ones((1,2,3))

>>> a.shape
(1, 2, 3)

>>> a.T.shape
(3, 2, 1)

>>> a.strides
(48, 24, 8)

>>> a.T.strides
(8, 24, 48)

1D numpy dizisi (rank-1 dizisi) durumunda, şekil ve adımlar 1 öğeli tuples'tir ve değiştirilemez ve böyle bir 1D dizisinin devri değiştirilmez. Bunun yerine, bir "satır-vektörü" (numpy şekil dizisi (1, n)) bir "sütun-vektör" e (numpy şekil dizisi) aktarabilirsiniz (n, 1). Bunu başarmak için önce 1D numpy dizinizi satır-vektörüne dönüştürmeniz ve daha sonra şekli ve adımları takas etmeniz gerekir. Aşağıda bunu yapan bir işlev vardır:

from numpy.lib.stride_tricks import as_strided

def transpose(a):
    a = np.atleast_2d(a)
    return as_strided(a, shape=a.shape[::-1], strides=a.strides[::-1])

Misal:

>>> a = np.arange(3)
>>> a
array([0, 1, 2])

>>> transpose(a)
array([[0],
       [1],
       [2]])

>>> a = np.arange(1, 7).reshape(2,3)
>>> a     
array([[1, 2, 3],
       [4, 5, 6]])

>>> transpose(a)
array([[1, 4],
       [2, 5],
       [3, 6]])

Tabii bu şekilde yapmak zorunda değilsiniz çünkü 1D dizisine sahip olduğunuzdan ve (n, 1)diziyi doğrudan a.reshape((-1, 1))veya ile diziye yeniden şekillendirebileceğinizden a[:, None]. Sadece bir dizi transpozisyonunun nasıl çalıştığını göstermek istedim.


0

Bunu şimdiye kadar 1 boyutlu diziler için kompakt ve okunabilir bir şekilde uygulamayı öğrendiğim yol:

h = np.array([1,2,3,4,5])

v1 = np.vstack(h)
v2 = np.c_[h]

h1 = np.hstack(v1)
h2 = np.r_[v2[:,0]]

numpy.r_ ve numpy.c_, dilim nesnelerini sırasıyla birinci ve ikinci eksen boyunca birleştirmeye çevirir. Bu nedenle, v2 dikey dizisini yatay h2 dizisine geri aktarmada dilimleme v2 [:, 0]

numpy.vstack , (N,) şekil dizilerinin (1, N) yeniden şekillendirilmesinden sonraki ilk eksen boyunca birleştirmeye eşdeğerdir. Dizileri vsplit'e bölerek yeniden oluşturur .

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.