सुन्न सरणी के केवल कुछ आयामों को कैसे समतल करें


128

वहाँ एक त्वरित तरीका है "उप-समतल" या समतल सरणी में केवल पहले आयामों में से कुछ को समतल करें?

उदाहरण के लिए, आयामों की एक सुस्पष्ट सरणी को देखते हुए (50,100,25), परिणामी आयाम होंगे(5000,25)



आप सुन्न ndarray सरणी टुकड़ा करने की क्रिया पर एक पुनश्चर्या पाठ्यक्रम की जरूरत है। बहु आयामी सरणी अनुक्रमण के रूप में भी जाना जाता है, देखें: docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html वर्ग कोष्ठक का उपयोग करके अपने ndarray को स्लाइस करें, और प्रत्येक को कितना अलग करने के लिए अल्पविराम का उपयोग करें आयाम आप चाहते हैं। यह कुछ ऐसा दिखेगा (बिल्कुल नहीं) यह: your_array[50:100, 7, :]जो 2 डी के लिए 3 डी ऑब्जेक्ट को समतल करता है, 2 आयाम के लिए केवल स्लाइस नंबर 7 का उपयोग करता है।
एरिक लेसचिंस्की

जवाबों:


129

Numpy.reshape पर एक नज़र डालें

>>> 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

अलेक्जेंडर के जवाब के लिए थोड़ा सा सामान्यीकरण - np.reshape एक तर्क के रूप में -1 ले सकता है, जिसका अर्थ है "कुल सरणी आकार अन्य सभी सूचीबद्ध आयामों के उत्पाद द्वारा विभाजित":

पिछले सभी आयामों को समतल करने के लिए उदा:

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

33

पीटर के उत्तर के लिए थोड़ा सा सामान्यीकरण - आप मूल सरणी के आकार पर एक सीमा निर्दिष्ट कर सकते हैं यदि आप तीन आयामी सरणियों से परे जाना चाहते हैं।

उदाहरण के लिए सभी अंतिम दो आयामों को समतल करें :

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

संपादित करें: मेरे पहले के उत्तर के लिए थोड़ा सा सामान्यीकरण - आप, निश्चित रूप से, पुनर्वसन की शुरुआत में भी एक सीमा निर्दिष्ट कर सकते हैं:

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
यह पहले से ही दो साल से अधिक हो गया है ... हमें एक और मामूली सामान्यीकरण की आवश्यकता है! ;)
Lith

1

एक वैकल्पिक दृष्टिकोण इस प्रकार है 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.