Saya memiliki array 2D dengan bentuk (35.6004) dan saya ingin mengurutkannya berdasarkan jumlah kolom. Jadi jika saya punya misalnya

array([[5, 3, 13], 
       [1, 2, 20],
       [6, 2,  6]])

Saya ingin mengurutkan array saya menjadi seperti itu

array([[13, 5, 3], 
       [20, 1, 2],
       [6 , 6, 2]]).

Saya mencoba menemukan indeks kolom

def find_max_col(o):
    t = o.sum(axis=0)
    te = t.tolist()
    return te.index(t.max())

Lalu saya menggunakan output dari fungsi itu untuk mengurutkan array

test = array[array[:, find_max_col(array)].argsort()]

Dan lakukan ini untuk memeriksa dan melihat apakah itu berhasil

t1 = test.sum(axis=0)
print(t1)

Seperti yang saya pahami jika saya mengurutkan menurut kolom dengan jumlah terbesar, saya harus mendapatkan array yang menunjukkan jumlah semua kolom dalam bentuk menurun sebagai output dari kode di atas.

Apakah kode saya untuk memeriksa jika bekerja salah, apakah saya membuat kesalahan dalam penyortiran atau apakah saya bahkan tidak menemukan indeks kolom yang benar untuk diurutkan?

0
Βασιλης Παλαιολογος 26 Mei 2021, 00:33

2 jawaban

Jawaban Terbaik

Saya tidak yakin apakah solusi Anda salah, tetapi tentu saja lebih rumit dari yang diperlukan:

>>> a = np.array([[5, 3, 13],
                  [1, 2, 20],
                  [6, 2,  6]])

>>> a[:, a.sum(axis=0).argsort()]  # sort columns small-to-large
array([[ 3,  5, 13],
       [ 2,  1, 20],
       [ 2,  6,  6]])

>>> a[:, (a.sum(axis=0)*-1).argsort()]  # multiply sums by -1 to sort large-to-small
array([[13,  5,  3],
       [20,  1,  2],
       [ 6,  6,  2]])
0
Woodford 25 Mei 2021, 22:06

Jika Anda ingin mengurutkan kolom berdasarkan urutan jumlah mereka, lakukan persis seperti itu.

idx = array.sum(axis=0).argsort()[::-1]
print(array[:,idx])

Tes Anda benar dan fakta bahwa itu tidak menghasilkan jawaban yang benar berarti Anda membuat kesalahan di tempat lain. Karena Anda ingin mengurutkan kolom, test setidaknya harus

test = array[:,array[:, find_max_col(array)].argsort()]

Kebetulan array[:, find_max_col(array)].argsort() untuk contoh persis Anda menghasilkan jawaban yang benar, tetapi untuk alasan yang salah. Anda menghitung indeks yang diurutkan dari kolom dengan jumlah tertinggi, yaitu array[:,2] == array([13, 20, 6]), ketika Anda seharusnya mengurutkan indeks jumlah kolom dalam urutan menurun, yaitu array.sum(axis=0) == array([12, 7, 39]).

1
Reti43 25 Mei 2021, 22:06