فهرست بستن

نکاتی پیرامون کار با آرایه‌های numpy در پایتون

کتابخانه محاسبات عددی numpy به همراه کتابخانه‌های scipy و matplotlib مجموعه‌ای غنی از امکانات را برای انجام شبیه سازی های علمی و بازنمایی آنها فراهم آورده اند. لکن نحوه استفاده از امکانات فراهم شده توسط این کتابخانه ها تعیین کننده میزان راحتتر شدن کار برای ما می باشد. در این نوشته به بررسی ریزه کاری هایی از آرایه numpy پرداخته خواهد شد.

بسم الله الرحمن الرحیم

آرایه‌ها کاربرد بسیار گسترده ای در مدل سازی ریاضی دارند، از این رو در بسیاری از کاربردهای مهندسی و محض ظاهر می شوند. در زبان برنامه نویسی پایتون کتابخانه numpy امکانات وسیعی برای استفاده از آرایه ها فراهم آورده است. در ادامه علاوه بر معرفی ابتدایی نحوه استفاده از آن، به بیان ریزه کاری های بسیار مهم مرتبط پرداخته می شود.

اولین مثال نحوه ایجاد یک آرایه با استفاده از یک لیست پایتون است. به قطعه کد زیر دقت نمایید:

from numpy import array

v = array([1, 2, 3, 4, 5, 6, 7, 8, 9])

در سطر اول از کتابخانه numpy کلاس array فراخوانی شده است . سپس در سطر بعدی با استفاده از آن، از روی لیستی آرایه v ساخته شده است. نکته این کد نوع داده برای عناصر آرایه است که آگاهی از آن در بعضی از کارهای محاسباتی ضروری است. برای مشاهده نوع داده های آرایه بصورت زیر عمل می کنیم:

print(v.dtype)

همانطور که می توان مشاهده کرد نوع داده int64 می باشد. با توجه به این که تمام آیتم های لیستی که از آن آرایه را ساخته ایم از نوع عدد صحیح بوده، آرایه نیز نوع عدد صحیح خواهد داشت. اگر بخواهیم الزام بر ایجاد آرایه از نوع داده خاص علیرغم نوع داده عناصر ابتدایی آن نماییم، بصورت زیر عمل می کنیم:

v = array([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype="float64")

خب، حالا که با ایجاد آرایه و همچنین اجبار نوع آن در صورت لزوم آشنا شدیم به سراغ نکات دیگر می رویم. یکی از کارهایی که مکررا زمان نوشتن برنامه های علمی انجام می گیرد، مرتب سازی آرایه ها می باشد. در numpy برای مرتب سازی داده ها به شکل زیر عمل می شود:

from numpy import random, sort

v = random.random(1000000)
v = sort(v)

حال اگر بخواهیم مرتب سازی نزولی باشد باید خودمان آرایه مرتب سازی شده صعودی را برعکس کنیم. البته این کار عملا بار محاسباتی وارد نمی کند. به مثال زیر توجه نمایید که زمان مورد نیاز برای مرتب سازی را نیز اندازه گیری می نماید:

from numpy import random, sort
from time import time

v = random.random(1000000)

t = time()
v = sort(v)
print(time() - t)

v = random.random(1000000)

t = time()
v = sort(v)[::-1]
print(time() - t)

اگر بخواهیم یک آرایه دو بعدی را بر اساس یک سطر یا ستون خاص مرتب سازی نمایید، ابتدا سطر یا ستون مورد نظر را مرتب می نماییم و سپس بر اساس اندیسهای مرتبسازی شده آرایه دو بعدی را بازآرایی می نماییم. به مثال زیر توجه نمایید:

from numpy import random, sort

v = random.random(size=(1000, 1000))
u = v[v[:,0].argsort()]

خروجی argsort اندیسهای مرتبسازی شده می باشد که آرایه تصادفی v با استفاده از آن بازآرایی شده و در u ذخیره می شود. همانطور که مشخص است مرتب سازی بر اساس ستون اول آرایه v انجام گرفته است.

نکته بعدی که بیان می شود انتخاب تعدادی سطر یا ستون از یک آرایه چند بعدی است. بسته به اینکه سطرها و ستونها پشت سر هم باشند یا نه می توان به دو صورت عمل کرد که با مثال توضیح داده خواهد شد:

from numpy import random

a = random.random(size=(10, 10))
print(a[:, 4:7])
print(a[:, [4, 5, 6]])

در این مثال یک آرایه دو بعدی ۱۰ در ۱۰ تصادفی ایجاد نموده و سعی می کنیم ستونهای چهارم تا ششم را جدا نماییم. برای اینکار به دو صورت می توان عمل کرد. می توان با گذاشتن یک دو نقطه : تمام سطرها و با ۴:۷ ستون چهارم تا ششم را انتخاب کرد. یا در حالت دیگر می توان تمام سطرها را با کولون و ستونهای مورد نظر را در یک لیست مشخص کرد. در صورتی که ستون ها مورد نظر ما به ترتیب پشت سر هم نباشند استفاده از روش دوم و مشخص کردن با لیست آسانتر خواهد بود. به مثال زیر توجه نمایید:

from numpy import random

a = random.random(size=(10, 10))
print(a[:, [1, 4, 8]])

نکته دیگر تغییر ابعاد آرایه numpy با استفاده از دستور reshape می‌باشد. برای نمونه به قطعه کد زیر توجه نمایید:

from numpy import array, reshape

a = array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
print(a)
print(a.reshape((2, 6)))
print(reshape(a, (2, 3, 2)))

همانطور که مشهد است برای تغییر ابعاد آرایه هم می‌توان از تابع reshape آماده شده در کلاس ndarray استفاده کرد و هم از تابع reshape از ماژول numpy. ابعاد جدید آرایه در هر دو حالت به شکل یک چندتایی وارد تابع می شود.

آخرین مبحثی که در این نوشته به آن پرداخته خواهد شد، تشکیل آرایه از کنار هم قرار دادن افقی و عمودی آرایه‌های دیگر می‌باشد. برای این کار می‌توان از توابع vstack و hstach استفاده کرد که نحوه استفاده از آنها در قطعه کد زیر نشان داده شده است. دقت نمایید که ورودی این توابع به شکل چندتایی حاوی آرایه‌های numpy می‌باشد.

from numpy import random, vstack, hstack

a = random.rand(2, 3)
b = random.rand(4, 3)
c = random.rand(2, 7)

print(vstack((a, b)))
print(hstack((a, c)))

در نظر داشته باشید که آرایه‌های کنار هم قرار گرفته باید از لحاظ ابعاد با همدیگر از منظر قرار گرفتن افقی یا عمومی سازگار باشند.

18 Comments

  1. Pari

    سلام. ببخشید چطوری در یک ارایه مقادیر غیر تکراری را بر گرادنیم مثلا در [۱و۲و۲و۳و۴و۴] رو به [۱و۲و۳و۴] تبدیل کنیم؟

    • ادمین

      سلام، می‌توانید از نوع داده مجموعه استفاده کنید:
      a = [1,2,2,3,4,4]
      b = set(a)
      print(b)
      می‌توانید مجموعه را دوباره به لیست تبدیل کنید:
      a = [1,2,2,3,4,4]
      b = list(set(a))
      print(b)

  2. Ghafari

    سلام،وقت بخیر.
    ببخشید اگر بخواهیم لیستهای تکراری از لیستی مثل لیست زیر حذف کنیم چیکارباید کرد(باتوجه به اینکه بعد این تبدیل بخواهیم برای لیست عملیات ریاضی انجام دهیم(به عبارتی اعدادحالت integerبودن خودشون رو حفظ کنند))؟؟
    باتشکر
    درصورتی که لیست بصورت زیرباشد:
    A=[[2,3,4],[5,6,7],[2,3,4],[9,8,2],[5,6,7]]
    تبدیل شود به:
    [[۲,۳,۴],[۵,۶,۷],[۹,۸,۲]]=A

    • ادمین

      سلام دوست عزیز، تابع آماده‌ای برای این منظور نمی‌شناسم ولی مثلا می‌توان این طور عمل کرد:

      a = [[2, 3, 4], [5, 6, 7], [2, 3, 4], [9, 8, 2], [5, 6, 7]]

      def func(l):
      o = []
      for i in range(len(l)):
      isInList = False
      for j in range(len(o)):
      if l[i] == o[j]:
      isInList = True
      break
      if not isInList:
      o.append(l[i])
      return o

      print(func(a))

      داخل کامنت کدها کمی به هم می‌خورند، خودتان باید فاصله‌گذاری‌ها را دوباره انجام دهید.

  3. Ghafari

    عرض سلام و وقت بخیر.
    آیا برای حذف آرایه های تکراری در یک ماتریس دو بعدی(درکتابخانهnumpy) دستور یا روشی وجود دارد؟
    دستور بالا که برای حذف لیستهای تکراری از لیستی میباشد درقسمت:
    isInList=True
    خطامیدهد،که علتش را متوجه نمیشوم.
    ممنون میشوم اگر امکان دارد راهنمایی کنید.

    • ادمین

      اگر فاصله‌گذاری‌ها صحیح باشند خطایی نمی‌دهد. با توجه به کد، ابتدای isInList=True باید چهار تا tab یا به تعداد چهار تا فاصله‌گذاری (با هر چند تا فاصله که برای هر indentation در نظر گرفته اید) باشد. با اینحال راه حل بهتر استفاده از تابع unique است:

      import numpy as np
      data = np.array([[1,8,3,3,4],
      [۱,۸,۹,۹,۴],
      [۱,۸,۳,۳,۴]])
      new_array = [tuple(row) for row in data]
      uniques = np.unique(new_array, axis=0)
      print(uniques)

  4. Ghafari

    ببخشید فک کنم درست منظورم را نرساندم،در تابعی که فرستادید برای لیستها تابع کاملا درست عمل میکند وبابت آن ممنونم.
    ولی در اینجا از آرایه های دوبعدی کتابخانهnumpyاستفاده میکنم که یکسری آرایه تکراری ایجاد میکند که میخواهم حذف شوند.
    فکر کنم این توضیحات گویا تر باشند:
    برای حذف آرایه های تکراری موجود در یک آرایه دوبعدی در پایتون به چه صورت باید عمل کرد آیا دستوری برای این کار وجود دارد؟
    توضیح مسئله:
    در انجام کدنویسی از کتابخانهnumpyاستفاده کردم که بعد از انجام عملیاتی فرضاً اینگونه خروجی بدست می اید:
    [[۲٫ ۳٫ ۴٫]
    [۳٫ ۴٫ ۵٫]
    [۲٫ ۳٫ ۴٫]
    [۱٫ ۲٫ ۳٫]
    [۳٫ ۴٫ ۵٫]]
    میخواهم خروجی نهایی بصورت زیر باشد(آرایه های تکراری حذف شوند):
    [[۲٫ ۳٫ ۴٫]
    [۳٫ ۴٫ ۵٫]
    [۳٫ ۴٫ ۵٫]]
    ممنون میشوم راهنمایی کنید🙏🙏

  5. Ghafari

    درسوال قبل
    A=[[۲٫ ۳٫ ۴٫]
    [۳٫ ۴٫ ۵٫]
    [۲٫ ۳٫ ۴٫]
    [۱٫ ۲٫ ۳٫]
    [۳٫ ۴٫ ۵٫]]
    ‘Numpy.ndarray’هستA و o تعریف شده ازنوع لیست است،ممکن است دلیل اجرا نشدن بخاطر تفاوت نوع باشد؟ممنون میشوم راهنمایی کنید

  6. dn

    سلام وقت بخیر،اگر بخوایم دوتا ارایه صعودی رو با هم ادغام کنیم که ان ارایه بدست امده هم به صورت صعودی چیده بشه باید چی کار کرد؟

    • ادمین

      با عرض سلام، لطفا سؤال خود را با مثال بیان کنید. متاسفانه برای من بطور کامل مشخص نیست دقیقا می‌خواهید چه کار کنید.

      • dn

        سلام ممنون سوال قبل و خودم متوجه شدم جوابش چی میشه،اما الان یک سوال دیگه دارم که با مثال می پرسم درمورد تکرار هستش:
        در پایتون می خوایم برنامه ای بنویسیم که یک ارایه ۲۰ تایی داشته باشیم که بین اعداد تصادفی ۱ تا ۱۵ پر شود(این قسمت میشه):
        from random import randint
        num={}
        for i in range(20):
        num.append(randint(1,15))
        print(num)
        temp=int(input(“plz enter number:”))
        حالا باید از بین اینها یک عدد خاص از ورودی بگیرد و نشان بده که اون عدد چند بار تکرار شده.
        این قسمتش و چطوری باید بنویسم؟

          • dn

            در ادامه اون چیزی که خودم نوشتم ،چیزی که شما ارسال کردین و میزارم برنامه چرا اجرا نمیشه؟ خطا میده برا اون قسمتnumpy(میگه حل نشده)

  7. dn

    line 1, in
    from numpy import random, sum
    ModuleNotFoundError: No module named ‘numpy’
    یکی دیگه هم اینه
    line 4, in
    num.append(randint(1,15))
    AttributeError: ‘dict’ object has no attribute ‘append’

    • ادمین

      خطای اول مربوط میشه به اینکه شما کتابخانه numpy رو نصب ندارید و برای استفاده از روش معرفی شده باید نصب کنید. اگر از ابزار pip استفاده می کنید می توانید با دستور pip install numpy کتابخانه را نصب نمایید. خطای دوم هم مربوط به این است که شما ظاهرا می خواستید یک لیست تعریف کنید ولی چون num رو برابر آکولاد (به جای کروشه) قرار داده اید نوع داده دیکشنری تعریف شده است.

      • dn

        خیلی ممنون مشکلم حل شد،اگر بخوایم همین مسئله رو داخل یک تابع بزاریم چطوری میشه؟ یعنی تابعی بنویسیم که یک ارایه۱۰ تایی و عدد مشخصی(مثلاx) رو از ورودی بگیره و بعد مشخص کنه این عدد داخل ارایه چندبار تکرار شده؟
        ببخشید خیلی سوال پرسیدم!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *