2010-08-23 16 views
45

Numpy kullanıyorum ve boyut bilgisini kaybetmeden bir satırı dizine eklemek istiyorum. Bu örnekte xslice olarak Boyut bilgisini kaybetmeden uyuşuk dizin dilimi

import numpy as np 
X = np.zeros((100,10)) 
X.shape  # >> (100, 10) 
xslice = X[10,:] 
xslice.shape # >> (10,) 

şimdi 1 boyuttur, ama olması (1,10) istiyorum. R'de X [10,:, drop = F] kullanırdım. Numpy'de benzer bir şey var mı? Dokümanlarda bulamadım ve sorulan benzer bir soru görmedim.

Teşekkürler!

cevap

29

Muhtemelen x[None, 10, :] veya eşdeğer (ama daha okunaklı) x[np.newaxis, 10, :] yapmak en kolaysıdır.

Varsayılan olarak neden olmasa da, kişisel olarak, tekil boyutlara sahip dizilerin sürekli olarak çok hızlı bir şekilde sinir bozucu olduğunu görüyorum. Numpy devleri de aynı şekilde sanırdım.

Ayrıca, sayısal tanıtıcı yayın dizileri çok iyi durumda, bu nedenle dilimin geldiği dizinin boyutunu korumak için genellikle çok az sebep var. Eğer yaptıysanız, o zaman aşağıdaki gibi şeyler işe yaramıyor ya da uygulanması çok daha zor olurdu:

a = np.zeros((100,100,10)) 
b = np.zeros(100,10) 
a[0,:,:] = b 

(Ya da en azından dilimleme boyut bilgisi bırakarak arkasında numpy dev muhakemesine benim tahminim)

+4

Bu çok yanlış geliyor ... – sebpiq

+1

Aslında, 'x [10,:, Yok]' bir dizi şekil döndürür (10,1), değil (1,10) '.. – Lisa

+4

@Lisa:' x [Yok, 10] 'istediğini yapacak. – naught101

13

Birkaç makul çözüm buldum.

1) numpy.take(X,[10],0)

2) İdeal bu garip indeksleme X[10:11:, :]

kullanmak kullanmak bu varsayılan olmalıdır. Boyutların neden düştüğünü asla anlamadım. Ancak, bu durum bir tartışma için ...

+0

Seçenek # 2 oldukça harika. –

38

Başka bir çözüm

X[[10],:] 

veya

I = array([10]) 
X[I,:] 

boyutluluğu yapmaktır İndeksleme, indekslerin bir listesi (veya dizisi) tarafından gerçekleştirildiğinde bir dizi korunur. Bu güzel çünkü boyutu ve sıkma arasında seçim yapmaktan vazgeçiyor.

+5

Bu, en iyi çözümdür. – Will

+1

Bu, dizi verilerini kopyalar – Per

+0

Bu her zaman böyle olmaz. Bakınız: x = np.array ([[1,2,3,4]]) ' eğer x '[[0], [1,2]]' ile dilimleyebilirseniz, tek boyutlu bir dizi elde edersiniz. ([2, 3]) 'Düşünceme göre, sütun ya da satır vektörleri seçilirken, dilimi basitleştirmek ve daha sonra 'np.reshape' kullanmak en iyisidir. Yani benim örneğimde, 'np.reshape (x [0, [ 1,2]], [1,2]) ' – Alexander

İlgili konular