Percaya atau tidak, setelah memprofilkan kode saya saat ini, operasi berulang dari array array numpy memakan sepotong besar waktu berjalan. Apa yang saya miliki saat ini adalah metode berbasis tampilan umum:
reversed_arr = arr[::-1]
Apakah ada cara lain untuk melakukannya dengan lebih efisien, atau hanya ilusi dari obsesi saya dengan kinerja numpy yang tidak realistis?
arr[::-1]
baru saja mengembalikan tampilan terbalik. Ini secepat yang Anda bisa dapatkan, dan tidak bergantung pada jumlah item dalam array, karena hanya mengubah langkahnya. Apakah yang Anda membalikkan sebenarnya array numpy?arr
adalah array numpy.f2py
adalah temanmu! Seringkali bermanfaat untuk menulis bagian-bagian penting dari suatu algoritma (terutama dalam komputasi ilmiah) dalam bahasa lain dan menyebutnya dari python. Semoga berhasil!arr[::-1]
: github.com/numpy/numpy/blob/master/numpy/lib/twodim_base.py . Caridef flipud
. Fungsinya secara harfiah empat baris.Jawaban:
Saat Anda membuat,
reversed_arr
Anda membuat tampilan ke dalam array asli. Anda kemudian dapat mengubah array asli, dan tampilan akan diperbarui untuk mencerminkan perubahan.Apakah Anda membuat ulang tampilan lebih sering dari yang seharusnya? Anda harus dapat melakukan sesuatu seperti ini:
Saya bukan ahli numpy, tapi sepertinya ini akan menjadi cara tercepat untuk melakukan hal-hal di numpy. Jika ini yang sudah Anda lakukan, saya pikir Anda tidak bisa memperbaikinya.
PS Diskusi hebat tentang pandangan numpy di sini:
Lihat ke array yang numpy?
sumber
look_at
fungsi yang seharusnya dilakukan?reversed_arr
masih dapat digunakan setelah data yang mendasarinya diubah. Menulis nilai baru ke dalam array tidak membuat tampilan menjadi tidak valid. Sebenarnya Anda juga bisa menggunakan tampilan untuk menulis nilai baru ke dalam array.reversed_arr[0] = 99
akan mengatur elemen terakhir dalam array ke 99, sama sepertiarr[-1] = 99
akan.Seperti yang disebutkan di atas,
a[::-1]
benar-benar hanya menciptakan tampilan, jadi ini adalah operasi waktu-konstan (dan karena itu tidak memakan waktu lebih lama ketika array tumbuh). Jika Anda membutuhkan array yang berdekatan (misalnya karena Anda melakukan banyak operasi vektor dengannya),ascontiguousarray
kira-kira secepatflipup
/fliplr
:Kode untuk menghasilkan plot:
sumber
Karena ini sepertinya belum ditandai sebagai dijawab ... Jawaban Thomas Arildsen haruslah yang tepat: gunakan saja
jika itu adalah array 1d (array kolom).
Dengan matriks lakukan
jika Anda ingin membalikkan baris dan
flipud(matrix)
jika Anda ingin membalik kolom. Tidak perlu membuat array kolom 1d Anda menjadi array baris 2dimensi (matriks dengan satu lapisan Tidak Ada) dan kemudian membaliknya.sumber
np.fliplr()
membalik array ke kiri.Perhatikan bahwa untuk array 1d, Anda perlu sedikit menipu:
sumber
reversed_arr = np.flipud(arr1d)
tampaknya bekerja secara langsung.Saya akan memperluas jawaban tentang sebelumnya
np.fliplr()
. Berikut adalah beberapa kode yang menunjukkan membangun array 1d, mengubahnya menjadi array 2d, membaliknya, lalu mengubahnya kembali menjadi array 1d.time.clock()
akan digunakan untuk menjaga waktu, yang disajikan dalam hitungan detik.Dengan pernyataan cetak tanpa komentar:
Dengan pernyataan cetak berkomentar:
Jadi, dalam hal efisiensi, saya pikir itu layak. Bagi Anda yang suka melakukannya dalam satu baris, di sini adalah bentuk itu.
sumber
Memperluas apa yang orang lain katakan saya akan memberikan contoh singkat.
Jika Anda memiliki larik 1D ...
Tetapi jika Anda bekerja dengan array 2D ...
Ini sebenarnya tidak membalik Matrix.
Harus menggunakan np.flip untuk benar-benar membalik elemen
Jika Anda ingin mencetak elemen dari matriks satu per satu gunakan flat bersama dengan flip
sumber
Agar dapat bekerja dengan angka negatif dan daftar panjang, Anda dapat melakukan hal berikut:
Di mana flipud adalah untuk ar 1d
sumber