Saya menggunakan numpy dan ingin mengindeks baris tanpa kehilangan informasi dimensi.
import numpy as np
X = np.zeros((100,10))
X.shape # >> (100, 10)
xslice = X[10,:]
xslice.shape # >> (10,)
Dalam contoh ini xslice sekarang menjadi 1 dimensi, tetapi saya menginginkannya menjadi (1,10). Di R, saya akan menggunakan X [10,:, drop = F]. Apa ada yang mirip di numpy. Saya tidak dapat menemukannya di dokumentasi dan tidak melihat pertanyaan serupa yang diajukan.
Terima kasih!
x[None, 10]
akan melakukan apa yang kamu inginkan.None
s Anda di samping redup yang Anda potong.b
; seharusnya begitub = np.zeros((100,10))
.X[10,None]
(menggunakan kode Anda sebagai contoh).np.matmul()
atau@
). Baru saja terbakar oleh ini.Solusi lain adalah melakukannya
X[[10],:]
atau
I = array([10]) X[I,:]
Dimensi array dipertahankan saat pengindeksan dilakukan oleh daftar (atau array) indeks. Ini bagus karena memberi Anda pilihan antara menjaga dimensi dan menekan.
sumber
x = np.array([[1,2,3,4]])
jika Anda kemudian mengirisnya denganx[[0],[1,2]]
Anda mendapatkan satu dimensiarray([2, 3])
Pendapat saya adalah ketika memilih vektor kolom atau baris yang terbaik adalah membuat potongannya sederhana dan kemudian menggunakannp.reshape
, Jadi dalam contoh saya itu adalahnp.reshape(x[0,[1,2]],[1,2])
X[[10]]
akan diartikan sebagaiX[10]
dan bentuk akan lebih kecil; serupa,X[[10, 20]] == X[10, 20]
dan bentuknya bahkan lebih kecila
bentuk(10, 20, 30)
, makaa[0, :, [0]]
akan memiliki bentuk(1, 20)
, bukan(20, 1)
, karena di indeks terakhir disiarkana[[0], :, [0]]
yang sering tidak seperti yang Anda harapkan! Padahala[0, :, :1]
akan memberi Anda(20, 1)
seperti yang diharapkan. Selain itu, lihat komentar di atas untuk kasus tepi aneh dengan indeks tunggal. Secara keseluruhan, sepertinya metode ini memiliki terlalu banyak kasus tepi.Saya menemukan beberapa solusi yang masuk akal.
1) gunakan
numpy.take(X,[10],0)
2) gunakan pengindeksan aneh ini
X[10:11:, :]
Idealnya, ini harus menjadi default. Saya tidak pernah mengerti mengapa dimensi pernah dijatuhkan. Tapi itu pembahasan untuk numpy ...
sumber
alist[0]
dan disimpan saat memotongnya.slice(n, n+1)
untuk mengekstraksi indeksn
) harus menjadi jawaban yang diterima, karena ini adalah satu-satunya yang meluas secara alami ke kasus dimensi-n.X[10:11, :]
dalam Python 3.7.5 (yaitu tanpa titik dua tambahan setelah 11)Inilah alternatif yang saya lebih suka. Alih-alih mengindeks dengan satu nomor, buat indeks dengan rentang. Artinya, gunakan
X[10:11,:]
. (Perhatikan bahwa10:11
tidak termasuk 11).import numpy as np X = np.zeros((100,10)) X.shape # >> (100, 10) xslice = X[10:11,:] xslice.shape # >> (1,10)
Ini membuatnya mudah untuk dipahami dengan lebih banyak dimensi juga, tidak ada
None
juggling dan mencari tahu sumbu mana untuk menggunakan indeks mana. Juga tidak perlu melakukan pembukuan tambahan terkait ukuran array, hanyai:i+1
untuk semuai
yang akan Anda gunakan dalam pengindeksan biasa.b = np.ones((2, 3, 4)) b.shape # >> (2, 3, 4) b[1:2,:,:].shape # >> (1, 3, 4) b[:, 2:3, :].shape . # >> (2, 1, 4)
sumber
Untuk menambah solusi yang melibatkan pengindeksan berdasarkan daftar atau larik oleh gnebehay, juga memungkinkan untuk menggunakan tupel:
X[(10,),:]
sumber
Hal ini sangat mengganggu jika Anda mengindeks oleh array yang mungkin berukuran panjang 1 saat runtime. Untuk kasus itu, ada
np.ix_
:sumber