Uyuşmuş bir dizinin yalnızca bazı boyutları nasıl düzleştirilir


128

Uyuşmuş bir dizideki ilk boyutları "alt düzleştirmenin" veya yalnızca bazılarını düzleştirmenin hızlı bir yolu var mı?

Örneğin, uyuşmuş bir boyut dizisi verildiğinde (50,100,25), ortaya çıkan boyutlar şöyle olacaktır:(5000,25)



Numpy ndarray dizi dilimleme konusunda tazeleme kursuna ihtiyacınız var. Çok boyutlu dizi indeksleme olarak da bilinir, bakınız: docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html Dizi, ndarray'inizi köşeli parantezler kullanarak dilimleyin ve her birinin ne kadarını ayırmak için virgül sınırlayıcıyı kullanın istediğiniz boyut. Şuna benzeyecektir (tam olarak değil): your_array[50:100, 7, :]bu, 2. boyut için yalnızca 7 numaralı dilimi kullanarak 3 boyutlu nesneyi 2d'ye düzleştirir.
Eric Leschinski

Yanıtlar:


129

Numpy.reshape'e bir göz atın .

>>> arr = numpy.zeros((50,100,25))
>>> arr.shape
# (50, 100, 25)

>>> new_arr = arr.reshape(5000,25)
>>> new_arr.shape   
# (5000, 25)

# One shape dimension can be -1. 
# In this case, the value is inferred from 
# the length of the array and remaining dimensions.
>>> another_arr = arr.reshape(-1, arr.shape[-1])
>>> another_arr.shape
# (5000, 25)

81

Alexander'ın cevabına küçük bir genelleme - np.reshape, -1'i argüman olarak alabilir, yani "toplam dizi boyutunun listelenen tüm diğer boyutların ürününe bölümü" anlamına gelir:

örneğin, son boyut dışında tümünü düzleştirmek için:

>>> arr = numpy.zeros((50,100,25))
>>> new_arr = arr.reshape(-1, arr.shape[-1])
>>> new_arr.shape
# (5000, 25)

33

Peter'ın cevabına küçük bir genelleme - üç boyutlu dizilerin ötesine geçmek istiyorsanız, orijinal dizinin şekli üzerinde bir aralık belirleyebilirsiniz.

örneğin, son iki boyut dışında tümünü düzleştirmek için :

arr = numpy.zeros((3, 4, 5, 6))
new_arr = arr.reshape(-1, *arr.shape[-2:])
new_arr.shape
# (12, 5, 6)

DÜZENLEME: Önceki cevabım için küçük bir genelleme - tabii ki yeniden şekillendirmenin başlangıcında da bir aralık belirtebilirsiniz:

arr = numpy.zeros((3, 4, 5, 6, 7, 8))
new_arr = arr.reshape(*arr.shape[:2], -1, *arr.shape[-2:])
new_arr.shape
# (3, 4, 30, 7, 8)

2
Zaten iki yıldan fazla oldu ... Küçük bir genellemeye daha ihtiyacımız var! ;)
Lith

1

Alternatif bir yaklaşım şu şekilde kullanmaktır numpy.resize():

In [37]: shp = (50,100,25)
In [38]: arr = np.random.random_sample(shp)
In [45]: resized_arr = np.resize(arr, (np.prod(shp[:2]), shp[-1]))
In [46]: resized_arr.shape
Out[46]: (5000, 25)

# sanity check with other solutions
In [47]: resized = np.reshape(arr, (-1, shp[-1]))
In [48]: np.allclose(resized_arr, resized)
Out[48]: True
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.