1 Boyutlu bir diziyi numpy'de 2B diziye dönüştürme


118

2D dizideki sütun sayısını belirterek 1 boyutlu bir diziyi 2 boyutlu bir diziye dönüştürmek istiyorum. Bunun gibi çalışacak bir şey:

> import numpy as np
> A = np.array([1,2,3,4,5,6])
> B = vec2matrix(A,ncol=2)
> B
array([[1, 2],
       [3, 4],
       [5, 6]])

Numpy'nin benim uydurma işlevim "vec2matrix" gibi çalışan bir işlevi var mı? (1B dizisini 2B dizi gibi indeksleyebileceğinizi anlıyorum, ancak bu benim sahip olduğum kodda bir seçenek değil - bu dönüşümü yapmam gerekiyor.)

Yanıtlar:


163

reshapeDiziyi istiyorsun .

B = np.reshape(A, (-1, 2))

burada -1yeni boyutun boyutunu girdi dizisinin boyutundan çıkarır.


44

İki seçeneğiniz var:

  • Artık orijinal şekli istemiyorsanız, en kolayı diziye yeni bir şekil atamaktır.

    a.shape = (a.size//ncols, ncols)

    Uygun şekli otomatik olarak hesaplamak için a.size//ncolsby anahtarını değiştirebilirsiniz -1. Bundan emin olun a.shape[0]*a.shape[1]=a.size, aksi takdirde bir sorunla karşılaşırsınız.

  • np.reshapeÇoğunlukla yukarıda sunulan sürüm gibi çalışan fonksiyona sahip yeni bir dizi elde edebilirsiniz.

    new = np.reshape(a, (-1, ncols))

    Mümkün olduğunda new, ilk dizinin bir görünümü olacaktır a, yani verilerin paylaşıldığı anlamına gelir. Ancak bazı durumlarda, newdizi bunun yerine bir kopya olacaktır. np.reshapeAyrıca order, satır-büyük C sırasından sütun ana Fortran sırasına geçmenizi sağlayan isteğe bağlı bir anahtar kelimeyi de kabul ettiğini unutmayın . metodun np.reshapefonksiyon versiyonudur a.reshape.

Gereksinime saygı a.shape[0]*a.shape[1]=a.sizeduyamıyorsanız, yeni bir dizi oluşturmak zorunda kalırsınız. Sen kullanabilirsiniz np.resizefonksiyonu ve ile karıştırılarak np.reshapegibi

>>> a =np.arange(9)
>>> np.resize(a, 10).reshape(5,2)

9

Şöyle bir şey dene:

B = np.reshape(A,(-1,ncols))

ncolsYine de dizinizdeki elemanların sayısını bölebileceğinizden emin olmanız gerekir . Ayrıca B, orderanahtar kelimeyi kullanarak sayıların çekildiği sırayla da oynayabilirsiniz .


4

Tek amacınız 1d dizisini X 2d dizisine dönüştürmekse, şunu yapın:

X = np.reshape(X,(1, X.size))

0
import numpy as np
array = np.arange(8) 
print("Original array : \n", array)
array = np.arange(8).reshape(2, 4)
print("New array : \n", array)

1
Kodla birlikte bazı açıklamalar eklemeniz daha iyidir.
Sid

Şimdi cevabınızın öncekinden nasıl farklı olduğunu ve ayrıca np.reshape kullanan yukarıdaki diğer cevapları açıklayabilir misiniz?
StupidWolf

0
some_array.shape = (1,)+some_array.shape

veya yeni bir tane al

another_array = numpy.reshape(some_array, (1,)+some_array.shape)

Bu, boyutları +1 yapar, en dıştaki köşeli ayraç eklemeye eşittir


-1

flatten()Numpy paketinden kullanabilirsiniz .

import numpy as np
a = np.array([[1, 2],
       [3, 4],
       [5, 6]])
a_flat = a.flatten()
print(f"original array: {a} \nflattened array = {a_flat}")

Çıktı:

original array: [[1 2]
 [3 4]
 [5 6]] 
flattened array = [1 2 3 4 5 6]

AttributeError: module 'numpy' has no attribute 'flatten'
Jamie F

1
Kodunuzu paylaşır mısınız? Çünkü uyuşmuşun şuflatten yöntemi var: docs.scipy.org/doc/numpy/reference/generated/…
Rafi

-2

1D dizisini Numpy kullanmadan 2D diziye değiştirin.

l = [i for i in range(1,21)]
part = 3
new = []
start, end = 0, part


while end <= len(l):
    temp = []
    for i in range(start, end):
        temp.append(l[i])
    new.append(temp)
    start += part
    end += part
print("new values:  ", new)


# for uneven cases
temp = []
while start < len(l):
    temp.append(l[start])
    start += 1
    new.append(temp)
print("new values for uneven cases:   ", new)
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.