এনডি থেকে 1 ডি অ্যারে


141

বলুন আমার একটি অ্যারে আছে a:

a = np.array([[1,2,3], [4,5,6]])

array([[1, 2, 3],
       [4, 5, 6]])

আমি এটিকে 1 ডি অ্যারে রূপান্তর করতে চাই (অর্থাত্ কলাম ভেক্টর):

b = np.reshape(a, (1,np.product(a.shape)))

কিন্তু এই ফিরে আসে

array([[1, 2, 3, 4, 5, 6]])

যা এর মতো নয়:

array([1, 2, 3, 4, 5, 6])

আমি এই অ্যারের প্রথম উপাদানটি ম্যানুয়ালি এটি 1D অ্যারে রূপান্তর করতে পারি:

b = np.reshape(a, (1,np.product(a.shape)))[0]

তবে এটির জন্য আমার জানতে হবে যে মূল অ্যারেটির কতগুলি মাত্রা রয়েছে (এবং উচ্চ মাত্রার সাথে কাজ করার সময় [0] এর সাথে সম্মতি জানাতে হবে)

একটি স্বেচ্ছাসেবক নাদারের থেকে কলাম / সারি ভেক্টর পাওয়ার কোনও মাত্রা-স্বাধীন উপায় আছে?

উত্তর:


277

ব্যবহারের np.ravel (ক 1D দেখার জন্য) অথবা np.ndarray.flatten (ক 1D কপি) অথবা np.ndarray.flat (একটি 1D ইটারেটরের জন্য):

In [12]: a = np.array([[1,2,3], [4,5,6]])

In [13]: b = a.ravel()

In [14]: b
Out[14]: array([1, 2, 3, 4, 5, 6])

নোট করুন যে যখন সম্ভব হবে তখন ravel()একটি viewপ্রদান করে a। পরিবর্তন তাই bএছাড়াও মডিফাই a। 1D উপাদানগুলি যখন মেমরির সাথে সুস্পষ্ট হয় তখন তা ravel()ফেরত দেয় viewতবে copyউদাহরণস্বরূপ, aএকটি ইউনিটবিহীন পদক্ষেপের আকার (উদাহরণস্বরূপ a = x[::2]) ব্যবহার করে অন্য অ্যারেগুলি কাটা থেকে তৈরি করা হলে এমন একটি ফিরে আসে ।

আপনি যদি ভিউয়ের চেয়ে কপি চান তবে ব্যবহার করুন want

In [15]: c = a.flatten()

আপনি যদি কেবল একটি পুনরুক্তি চান, ব্যবহার করুন np.ndarray.flat:

In [20]: d = a.flat

In [21]: d
Out[21]: <numpy.flatiter object at 0x8ec2068>

In [22]: list(d)
Out[22]: [1, 2, 3, 4, 5, 6]

4
<pedantic> এই উদাহরণে, ravel()একটি দর্শন ফেরত দেয় তবে এটি সর্বদা সত্য হয় না। সেখানে মামলা কোথায় আছেন তা ravel()একটি কপি ফেরৎ </ গোঁড়া>।
ওয়ারেন Weckesser

3
a.ravel()হিসাবে দ্রুত হিসাবে প্রায় তিন গুণ মনে হচ্ছে a.reshape(-1)a.flatten()এটি একটি কপি তৈরি করা দরকার হিসাবে উপায় ধীর।
বলপয়েন্টবেন

25
In [14]: b = np.reshape(a, (np.product(a.shape),))

In [15]: b
Out[15]: array([1, 2, 3, 4, 5, 6])

বা, সহজভাবে:

In [16]: a.flatten()
Out[16]: array([1, 2, 3, 4, 5, 6])

11
b = a.reshape(-1)সংক্ষেপে প্রথম উদাহরণ হিসাবে ব্যবহার করতে পারেন ।
সিরিটিজ মেজর

5

একটি সহজ উপায় হ'ল ব্যবহার করা flatten(), উদাহরণস্বরূপ:

 import numpy as np

 batch_y =train_output.iloc[sample, :]
 batch_y = np.array(batch_y).flatten()

আমার অ্যারেটি এটির মতো ছিল:

    0
0   6
1   6
2   5
3   4
4   3
.
.
.

ব্যবহারের পরে flatten():

array([6, 6, 5, ..., 5, 3, 6])

এটি এই ধরণের ত্রুটির সমাধানও:

Cannot feed value of shape (100, 1) for Tensor 'input/Y:0', which has shape '(?,)' 

4

বিভিন্ন আকারের ব্যবহার সহ অ্যারের তালিকার জন্য:

import numpy as np

# ND array list with different size
a = [[1],[2,3,4,5],[6,7,8]]

# stack them
b = np.hstack(a)

print(b)

আউটপুট:

[1 2 3 4 5 6 7 8]


আপনি aফিরে থেকে আকৃতি পাবেন কিভাবে b?
dvdblk

আপনি চাইলে 1 ডি ভাগ করে দিন divide এই দেখুন stackoverflow.com/a/8495740/6117565
বিক্রম

4

আমি আনটবু সহ উত্তরে উল্লিখিত ফাংশনগুলির একটি মানদণ্ডের ফলাফল দেখতে চেয়েছিলাম

এছাড়াও এটি উল্লেখ করতে চান যে নম্পুটি ডকটি ব্যবহারের arr.reshape(-1)ক্ষেত্রে ভিউকে পছন্দনীয় বলে প্রস্তাব দেয়। (যদিও ravelনিম্নলিখিত ফলাফলের মধ্যে শিশু দ্রুত)


টিএল; ডিআর : np.ravelসর্বাধিক অভিনয় (খুব অল্প পরিমাণে)।

মাপকাঠি

কার্যাবলী:

  • np.ravel: সম্ভব হলে ভিউ রিটার্ন করে
  • np.reshape(-1): সম্ভব হলে ভিউ রিটার্ন করে
  • np.flatten: অনুলিপি প্রদান
  • np.flat: ফেরত দেয় numpy.flatiter। অনুরূপ, একই, সমতুল্যiterable

অদ্ভুত সংস্করণ: '1.18.0'

বিভিন্ন ndarrayআকারে কার্যকর করার সময়

+-------------+----------+-----------+-----------+-------------+
|  function   |   10x10  |  100x100  | 1000x1000 | 10000x10000 |
+-------------+----------+-----------+-----------+-------------+
| ravel       | 0.002073 |  0.002123 |  0.002153 |    0.002077 |
| reshape(-1) | 0.002612 |  0.002635 |  0.002674 |    0.002701 |
| flatten     | 0.000810 |  0.007467 |  0.587538 |  107.321913 |
| flat        | 0.000337 |  0.000255 |  0.000227 |    0.000216 |
+-------------+----------+-----------+-----------+-------------+

উপসংহার

ravelএবং reshape(-1)এর কার্যকর করার সময়টি নাদারের আকার থেকে সামঞ্জস্যপূর্ণ এবং স্বাধীন ছিল। তবে, ravelবাচ্চাটি দ্রুত, তবে reshapeআকার পুনরায় আকার দেওয়ার ক্ষেত্রে নমনীয়তা সরবরাহ করে। (হয়তো কেন যে numpy ডক সুপারিশ এটা পরিবর্তে ব্যবহার করতে। অথবা কিছু ক্ষেত্রে যেখানে হতে পারে reshapeআয় দেখতে এবং ravelনেই)।
আপনি যদি বড় আকারের নাদারের সাথে ডিল করে থাকেন তবে ব্যবহার করা flattenকোনও পারফরম্যান্স সমস্যার কারণ হতে পারে। এটি ব্যবহার না করার পরামর্শ দিন। আপনার অন্য কিছু করার জন্য ডেটা অনুলিপি না লাগলে।

ব্যবহৃত কোড

import timeit
setup = '''
import numpy as np
nd = np.random.randint(10, size=(10, 10))
'''

timeit.timeit('nd = np.reshape(nd, -1)', setup=setup, number=1000)
timeit.timeit('nd = np.ravel(nd)', setup=setup, number=1000)
timeit.timeit('nd = nd.flatten()', setup=setup, number=1000)
timeit.timeit('nd.flat', setup=setup, number=1000)

0

যদিও এটি এনপি অ্যারে ফর্ম্যাটটি ব্যবহার করছে না, (আমার কোডটি সংশোধন করতে অলস করার জন্য) এটি আপনার যা করা উচিত তা করা উচিত ... যদি আপনি সত্যিকার অর্থে একটি কলাম ভেক্টর চান তবে আপনি ভেক্টরের ফলাফল স্থানান্তর করতে চাইবেন। এটি কীভাবে আপনি এটি ব্যবহার করার পরিকল্পনা করছেন তার উপর নির্ভর করে।

def getVector(data_array,col):
    vector = []
    imax = len(data_array)
    for i in range(imax):
        vector.append(data_array[i][col])
    return ( vector )
a = ([1,2,3], [4,5,6])
b = getVector(a,1)
print(b)

Out>[2,5]

সুতরাং আপনার যদি ট্রান্সপোজ করার দরকার হয় তবে আপনি এর মতো কিছু করতে পারেন:

def transposeArray(data_array):
    # need to test if this is a 1D array 
    # can't do a len(data_array[0]) if it's 1D
    two_d = True
    if isinstance(data_array[0], list):
        dimx = len(data_array[0])
    else:
        dimx = 1
        two_d = False
    dimy = len(data_array)
    # init output transposed array
    data_array_t = [[0 for row in range(dimx)] for col in range(dimy)]
    # fill output transposed array
    for i in range(dimx):
        for j in range(dimy):
            if two_d:
                data_array_t[j][i] = data_array[i][j]
            else:
                data_array_t[j][i] = data_array[j]
    return data_array_t
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.