Ubah larik 1D menjadi larik 2D secara numpy

118

Saya ingin mengubah larik 1 dimensi menjadi larik 2 dimensi dengan menentukan jumlah kolom dalam larik 2D. Sesuatu yang akan bekerja seperti ini:

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

Apakah numpy memiliki fungsi yang berfungsi seperti fungsi buatan saya "vec2matrix"? (Saya mengerti bahwa Anda dapat mengindeks larik 1D seperti larik 2D, tetapi itu bukan opsi dalam kode yang saya miliki - saya perlu melakukan konversi ini.)

Alex Williams
sumber

Jawaban:

163

Anda ingin reshapearray.

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

di mana -1menyimpulkan ukuran dimensi baru dari ukuran array input.

Matt Ball
sumber
44

Anda memiliki dua pilihan:

  • Jika Anda tidak lagi menginginkan bentuk aslinya, cara termudah adalah dengan menetapkan bentuk baru ke array

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

    Anda dapat mengganti a.size//ncolsdengan -1untuk menghitung bentuk yang tepat secara otomatis. Pastikan itu a.shape[0]*a.shape[1]=a.size, kalau tidak Anda akan mengalami beberapa masalah.

  • Anda bisa mendapatkan array baru dengan np.reshapefungsi tersebut, yang sebagian besar berfungsi seperti versi yang disajikan di atas

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

    Jika memungkinkan, newhanya akan menjadi tampilan dari array awal a, artinya datanya dibagikan. Namun, dalam beberapa kasus, newarray akan menjadi salinan. Perhatikan bahwa np.reshapejuga menerima kata kunci opsional orderyang memungkinkan Anda beralih dari urutan C mayor baris ke urutan Fortran utama kolom. np.reshapeadalah versi fungsi dari a.reshapemetode ini.

Jika Anda tidak dapat memenuhi persyaratan tersebut a.shape[0]*a.shape[1]=a.size, Anda tidak dapat lagi membuat array baru. Anda dapat menggunakan np.resizefungsi dan mencampurnya dengan np.reshape, seperti

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

Cobalah sesuatu seperti:

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

Anda harus memastikan bahwa Anda dapat membagi jumlah elemen dalam array Anda ncols. Anda juga dapat bermain dengan urutan nomor yang ditarik Bmenggunakan orderkata kunci.

JoshAdel
sumber
4

Jika satu-satunya tujuan Anda adalah mengonversi larik 1d X menjadi larik 2d, lakukan saja:

X = np.reshape(X,(1, X.size))
Arun
sumber
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)
Ayush Kapri
sumber
1
Lebih baik Anda memasukkan beberapa penjelasan bersama dengan kode.
Sid
Bisa dijelaskan bagaimana jawaban Anda sekarang berbeda dengan jawaban sebelumnya dan juga jawaban lain di atas, yang juga menggunakan np.reshape?
StupidWolf
0
some_array.shape = (1,)+some_array.shape

atau dapatkan yang baru

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

Ini akan membuat dimensi +1, sama dengan menambahkan tanda kurung di paling luar

ZDL-begitu
sumber
-1

Anda dapat menggunakan flatten()dari paket numpy.

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}")

Keluaran:

original array: [[1 2]
 [3 4]
 [5 6]] 
flattened array = [1 2 3 4 5 6]
Rafi
sumber
AttributeError: module 'numpy' has no attribute 'flatten'
Jamie F
1
Bisakah Anda membagikan kode Anda? Karena numpy memang punya flattenmetode: docs.scipy.org/doc/numpy/reference/generated/…
Rafi
-2

Ubah larik 1D menjadi larik 2D tanpa menggunakan Numpy.

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)
Ayush Kapri
sumber