1 डी सरणी को 2 डी सरणी में संख्यात्मक रूप में परिवर्तित करें


118

मैं 2D आयाम में कॉलम की संख्या निर्दिष्ट करके 1-आयामी सरणी को 2-आयामी सरणी में परिवर्तित करना चाहता हूं। कुछ इस तरह काम करेगा:

> import numpy as np
> A = np.array([1,2,3,4,5,6])
> B = vec2matrix(A,ncol=2)
> B
array([[1, 2],
       [3, 4],
       [5, 6]])

क्या सुन्न में एक फ़ंक्शन होता है जो मेरे बनाये गए फ़ंक्शन "vec2matrix" की तरह काम करता है? (मैं समझता हूं कि आप 1 डी सरणी को 2 डी सरणी की तरह अनुक्रमित कर सकते हैं, लेकिन मेरे पास कोड में कोई विकल्प नहीं है - मुझे यह रूपांतरण करने की आवश्यकता है।)

जवाबों:


163

आप reshapeसरणी के लिए चाहते हैं ।

B = np.reshape(A, (-1, 2))

जहां -1इनपुट सरणी के आकार से नए आयाम के आकार को संक्रमित करता है।


44

आपके पास दो विकल्प हैं:

  • यदि आप अब मूल आकार नहीं चाहते हैं, तो सबसे आसान है कि आप सरणी को एक नया आकार प्रदान करें

    a.shape = (a.size//ncols, ncols)

    आप बदल सकते हैं a.size//ncolsद्वारा -1स्वचालित रूप से उचित आकार की गणना करने के। सुनिश्चित करें कि a.shape[0]*a.shape[1]=a.size, आप किसी समस्या में भाग लेंगे।

  • आप np.reshapeफ़ंक्शन के साथ एक नया सरणी प्राप्त कर सकते हैं , जो कि ऊपर दिए गए संस्करण की तरह काम करता है

    new = np.reshape(a, (-1, ncols))

    जब यह संभव newहोगा , तो प्रारंभिक सरणी का केवल एक दृश्य होगा a, जिसका अर्थ है कि डेटा साझा किए गए हैं। हालांकि, कुछ मामलों में, newसरणी को इसके बजाय एकोपी किया जाएगा। ध्यान दें कि np.reshapeएक वैकल्पिक कीवर्ड को भी स्वीकार करता orderहै जो आपको पंक्ति-प्रमुख C क्रम से कॉलम-प्रमुख फोरट्रान क्रम पर स्विच करने देता है। विधि np.reshapeका फ़ंक्शन संस्करण है a.reshape

यदि आप आवश्यकता का सम्मान नहीं कर सकते हैं a.shape[0]*a.shape[1]=a.size, तो आप एक नया सरणी बनाने के लिए फंस गए हैं। आप np.resizeफ़ंक्शन का उपयोग कर सकते हैं और इसके साथ मिश्रण कर सकते हैं np.reshape, जैसे कि

>>> a =np.arange(9)
>>> np.resize(a, 10).reshape(5,2)

9

कुछ इस तरह की कोशिश करो:

B = np.reshape(A,(-1,ncols))

आपको यह सुनिश्चित करने की आवश्यकता होगी कि आप अपने सरणी में कितने तत्वों को विभाजित कर सकते हैं ncols। आप उस क्रम से भी खेल सकते हैं जिसमें संख्याएँ कीवर्ड Bका उपयोग करके खींची जाती हैं order


4

यदि आपका एकमात्र उद्देश्य 1d सरणी X को 2d सरणी में परिवर्तित करना है तो बस करें:

X = np.reshape(X,(1, X.size))

0
import numpy as np
array = np.arange(8) 
print("Original array : \n", array)
array = np.arange(8).reshape(2, 4)
print("New array : \n", array)

1
यह बेहतर है कि आप कोड के साथ कुछ स्पष्टीकरण भी शामिल करें।
सिड

क्या आप बता सकते हैं कि आपका उत्तर अब पहले से अलग कैसे है और ऊपर दिए गए अन्य उत्तर भी, जो np.reshape का उपयोग करता है?
स्टुपिडॉल्फ

0
some_array.shape = (1,)+some_array.shape

या एक नया प्राप्त करें

another_array = numpy.reshape(some_array, (1,)+some_array.shape)

यह आयाम +1 बना देगा, सबसे बाहरी पर एक ब्रैकेट जोड़ने के बराबर है


-1

आप flatten()संख्यात्मक पैकेज से उपयोग कर सकते हैं ।

import numpy as np
a = np.array([[1, 2],
       [3, 4],
       [5, 6]])
a_flat = a.flatten()
print(f"original array: {a} \nflattened array = {a_flat}")

आउटपुट:

original array: [[1 2]
 [3 4]
 [5 6]] 
flattened array = [1 2 3 4 5 6]

AttributeError: module 'numpy' has no attribute 'flatten'
जेमी एफ

1
क्या आप अपना कोड साझा कर सकते हैं? क्योंकि सुन्न यकीन है कि flattenविधि है: docs.scipy.org/doc/numpy/reference/generated/…
रफी

-2

Numpy का उपयोग किए बिना 1D सरणी को 2D सरणी में बदलें।

l = [i for i in range(1,21)]
part = 3
new = []
start, end = 0, part


while end <= len(l):
    temp = []
    for i in range(start, end):
        temp.append(l[i])
    new.append(temp)
    start += part
    end += part
print("new values:  ", new)


# for uneven cases
temp = []
while start < len(l):
    temp.append(l[start])
    start += 1
    new.append(temp)
print("new values for uneven cases:   ", new)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.