فهرست بستن

شروع به استفاده از کتابخانه NumPy در پایتون با صد قدم

اگر از زبان خشک، بی روح و غیر تکنیکی متلب برای شبیه سازی ها و محاسبات علمی و عددیتان خسته شده اید و می خواهید با زبان پایتون که انعطاف پذیری و سرعت بیشتری نسبت به متلب دارد به انجام کارهای شبیه سازیتان بپردازید، پیشنهاد ما برای شما استفاده از کتابخانه NumPy می‌باشد. این کتابخانه در کنار دو کتابخانه SciPy و  matplotlib تمام آنچه شما نیاز دارید را در خود دارد. در این نوشته در صد قدم ساده و ابتدایی شروع به یادگیری سریع کار با NumPy خواهیم کرد.

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

اگر جایی این مطالب را استفاده کردید حتما آدرس ما را هم بگذارید! با تاکید بر اینکه بعضی دستورات فقط برای اجرا در ipython هستند، بریم سر اصل مطلب:

۱. فراخوانی کتابخانه با نام np:

import numpy as np

۲. دیدن شماره ویرایش نصب شده NumPy و پیکربندی کتابخانه:

print(np.__version__)
np.show_config()

۳. ایجاد بردار صفر به طول ده:

Z = np.zeros(10)
print(Z)

۴. پیدا کردن حجم حافظه یک آرایه:

Z = np.zeros((10,10))
print("%d bytes" % (Z.size * Z.itemsize))

۵. چگونه مستندات تابع add از numpy را مشاهده نماییم:

%run `python -c "import numpy; numpy.info(numpy.add)"`

۶. ایجاد بردار صفر با طول ده عنصر که عنصر پنجم آن برابر یک می باشد:

Z = np.zeros(10)
Z[4] = 1
print(Z)

۷. ایجاد برداری با عناصر در محدوده ۱۰ الی ۴۹:

Z = np.arange(10,50)
print(Z)

۸. معکوس کردن ترتیب عناصر در یک بردار:

Z = np.arange(50)
Z = Z[::-1]
print(Z)

۹. ایجاد یک آرایه دو بعدی ۳×۳ که عناصر آن اعداد ۰ تا ۸ هستند:

Z = np.arange(9).reshape(3,3)
print(Z)

۱۰. پیدا کردن اندیس عناصر غیر صفر در یک بردار:

nz = np.nonzero([1,2,0,0,4,0])
print(nz)

۱۱. ایجاد آرایه دو بعدی همانی ۳×۳:

Z = np.eye(3)
print(Z)

۱۲. ایجاد آرایه سه بعدی تصادفی با ابعاد ۳x3x3:

Z = np.random.random((3,3,3))
print(Z)

۱۳. ایجاد آرایه دو بعدی ۱۰×۱۰ با عناصر تصادفی و پیدا کردن مینیمم و ماکسیمم آن:

Z = np.random.random((10,10))
Zmin, Zmax = Z.min(), Z.max()
print(Zmin, Zmax)

۱۴. ایجاد بردار تصادفی با سایز ۳۰ و پیدا کردن میانگین آن:

Z = np.random.random(30)
m = Z.mean()
print(m)

۱۵. ایجاد آرایه دو بعدی با مقادیر یک در عناصر حاشیه‌ای و مقادیر صفر در قسمتهای داخلی آرایه:

Z = np.ones((10,10))
Z[1:-1,1:-1] = 0
print(Z)

۱۶. اضافه کردن حاشیه با مقدار ثابت (در این مثال صفر) برای یک آرایه موجود:

Z = np.ones((5,5))
Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0)
print(Z)

۱۷. حاصل عبارات زیر را با هم ببینیم:

print(0 * np.nan)
print(np.nan == np.nan)
print(np.inf > np.nan)
print(np.nan - np.nan)
print(0.3 == 3 * 0.1)

۱۸. ایجاد آرایه دو بعدی ۵×۵ با مقادیر ۱، ۲، ۳ و ۴ در زیر قطر اصلی:

Z = np.diag(1+np.arange(4),k=-1)
print(Z)

۱۹. ایجاد آرایه دو بعدی ۸×۸ و پر کردن آن بصورت شطرنجی:

Z = np.zeros((8,8),dtype=int)
Z[1::2,::2] = 1
Z[::2,1::2] = 1
print(Z)

۲۰. یک آرایه با ابعاد (۶,۷,۸) در نظر بگیرید. اندیس صدمین عنصر این آرایه به شکل سه تایی (x,y,z) به این شکل است:

print(np.unravel_index(100,(6,7,8)))

۲۱. ایجاد یک آرایه شطرنجی ۸×۸ با استفاده از تابع tile:

Z = np.tile( np.array([[0,1],[1,0]]), (4,4))
print(Z)

۲۲. نرمالایز کردن یک آرایه تصادفی ۵×۵:

Z = np.random.random((5,5))
Zmax, Zmin = Z.max(), Z.min()
Z = (Z - Zmin)/(Zmax - Zmin)
print(Z)

۲۳. ایجاد یک dtype که رنگ را به شکل چهارتایی (r,g,b,a) با عناصر بایت بدون علامت نشان دهد:

color = np.dtype([("r", np.ubyte, 1),
                  ("g", np.ubyte, 1),
                  ("b", np.ubyte, 1),
                  ("a", np.ubyte, 1)])

۲۴. ضرب ماتریسی دو آرایه دو بعدی ۵×۳ و ۳×۲:

Z = np.dot(np.ones((5,3)), np.ones((3,2)))
print(Z)

# روش جایگزین در پایتون ۳٫۵ به بالا
Z = np.ones((5,3)) @ np.ones((3,2))
print(Z)

۲۵. منفی کردن تمام عناصر یک آرایه تک بعدی که مقدار بین ۳ و ۸ دارند:

# Author: Evgeni Burovski

Z = np.arange(11)
Z[(3 < Z) & (Z <= 8)] *= -1
print(Z)

۲۶. خروجی این عبارت را با هم ببینیم:

# Author: Jake VanderPlas

print(sum(range(5),-1))
from numpy import *
print(sum(range(5),-1))

۲۷. بردار صحیح Z  را در نظر بگیرید. ببینیم کدام یک از عبارات زیر درست هستند:

Z**Z
۲ << Z >> 2
Z <- Z
۱j*Z
Z/1/1
Z<Z>Z

۲۸. ببینیم خروجی عبارتهای زیر به چه شکل خواهد بود:

print(np.array(0) / np.array(0))
print(np.array(0) // np.array(0))
print(np.array([np.nan]).astype(int).astype(float))

۲۹. روند کردن یک آرایه با نوع ممیز شناور:

# Author: Charles R Harris

Z = np.random.uniform(-10,+10,10)
print (np.copysign(np.ceil(np.abs(Z)), Z))

۳۰. پیدا کردن عناصر مشترک بین دو آرایه:

Z1 = np.random.randint(0,10,10)
Z2 = np.random.randint(0,10,10)
print(np.intersect1d(Z1,Z2))

۳۱. غیر فعال کردن تمام اخطارهای NumPy:

# فعال کردن حالت خودکشی!
defaults = np.seterr(all="ignore")
Z = np.ones(1) / 0

# برگرداندن به حالت عادی
_ = np.seterr(**defaults)

یک روش مشابه ولی کنترل شده برای کدهای خاص:

with np.errstate(divide='ignore'):
    Z = np.ones(1) / 0

۳۲. خروجی عبارت زیر را ببینید true یا false؟:

np.sqrt(-1) == np.emath.sqrt(-1)

۳۳. گرفتن تاریخ دیروز، امروز و فردا:

yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D')
today     = np.datetime64('today', 'D')
tomorrow  = np.datetime64('today', 'D') + np.timedelta64(1, 'D')

۳۴. تمام تاریخ‌ها در ماه جولای سال ۲۰۱۶:

Z = np.arange('2016-07', '2016-08', dtype='datetime64[D]')
print(Z)

۳۵. محاسبه ((A+B)*(-A/2)) بدون کپی کردن خروجی در حافظه دیگر:

A = np.ones(3)*1
B = np.ones(3)*2
C = np.ones(3)*3
np.add(A,B,out=B)
np.divide(A,2,out=A)
np.negative(A,out=A)
np.multiply(A,B,out=A)

۳۶. جدا کردن قسمت صحیح عناصر یک بردار با مقادیر تصادفی به پنج روش:

Z = np.random.uniform(0,10,10)

print (Z - Z%1)
print (np.floor(Z))
print (np.ceil(Z)-1)
print (Z.astype(int))
print (np.trunc(Z))

۳۷. ایجاد یک آرایه دو بعدی ۵×۵ با مقادیر عناصر سطری از صفر تا ۴:

Z = np.zeros((5,5))
Z += np.arange(5)
print(Z)

۳۸. ایجاد یک آرایه با استفاده از یک تابع مولد که ۱۰ عدد صحیح تولید می کند:

def generate():
    for x in range(10):
        yield x
Z = np.fromiter(generate(),dtype=float,count=-1)
print(Z)

۳۹. ایجاد یک بردار با ده مقدار بین صفر و یک که خود صفر و یک در آن نباشند:

Z = np.linspace(0,1,12,endpoint=True)[1:-1]
print(Z)

۴۰. ایجاد یک بردار تصادفی ده عددی و مرتب سازی آن:

Z = np.random.random(10)
Z.sort()
print(Z)

۴۱. جمع زدن عناصر یک آرایه کوچک سریع تر از تابع np.sum:

# Author: Evgeni Burovski

Z = np.arange(10)
np.add.reduce(Z)

۴۲. مقایسه دو آرایه تصادفی A و B که مساوی هستند یا نه:

A = np.random.randint(0,2,5)
B = np.random.randint(0,2,5)

# با فرض شکل آرایه ها و تولرانسی برای مقادیر
equal = np.allclose(A,B)
print(equal)

# با فرض شکل آرایه ها و مقادیر (بدون در نظر گرفتن تولرانس، یعنی باید مقادیر دقیقا برابر باشند)
equal = np.array_equal(A,B)
print(equal)

۴۳. غیر قابل تغییر کردن یک آرایه:

Z = np.zeros(10)
Z.flags.writeable = False
Z[0] = 1

۴۴. تبدیل مختصات کارتزین به قطبی از یک آرایه دو بعدی با ابعاد ۱۰×۲:

Z = np.random.random((10,2))
X,Y = Z[:,0], Z[:,1]
R = np.sqrt(X**2+Y**2)
T = np.arctan2(Y,X)
print(R)
print(T)

۴۵. ایجاد یک بردار تصادفی ده تایی و جایگزین کردن بزرگترین عدد با صفر:

Z = np.random.random(10)
Z[Z.argmax()] = 0
print(Z)

۴۶. ایجاد یک آرایه ساخت یافته که دارای دو مؤلفه x و y می باشد و محدوده صفر تا یک را برای هر دو مختصات دربرگیرد:

Z = np.zeros((5,5), [('x',float),('y',float)])
Z['x'], Z['y'] = np.meshgrid(np.linspace(0,1,5),
                             np.linspace(0,1,5))
print(Z)

۴۷. محاسبه ماتریس کوشی برای دو آرایه X و Y:

# Author: Evgeni Burovski

X = np.arange(8)
Y = X + 0.5
C = 1.0 / np.subtract.outer(X, Y)
print(np.linalg.det(C))

۴۸. مشاهده مینیمم و ماکسیمم مقدار قابل ذخیره در انواع داده در NumPy:

for dtype in [np.int8, np.int32, np.int64]:
   print(np.iinfo(dtype).min)
   print(np.iinfo(dtype).max)
for dtype in [np.float32, np.float64]:
   print(np.finfo(dtype).min)
   print(np.finfo(dtype).max)
   print(np.finfo(dtype).eps)

۴۹. پرینت تمام عناصر آرایه:

np.set_printoptions(threshold=np.nan)
Z = np.zeros((16,16))
print(Z)

۵۰. پیدا کردن نزدیکترین مقدار به یک اسکالر در یک آرایه:

Z = np.arange(100)
v = np.random.uniform(0,100)
index = (np.abs(Z-v)).argmin()
print(Z[index])

۵۱. ایجاد یک آرایه ساخت یافته با نمایش یک مختصات دو بعدی و یک رنگ rgb:

Z = np.zeros(10, [ ('position', [ ('x', float, 1),
                                  ('y', float, 1)]),
                   ('color',    [ ('r', float, 1),
                                  ('g', float, 1),
                                  ('b', float, 1)])])
print(Z)

۵۲. با فرض یک بردار مختصات تصادفی ۱۰×۲ فاصله نقطه به نقطه را می یابیم:

Z = np.random.random((10,2))
X,Y = np.atleast_2d(Z[:,0], Z[:,1])
D = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2)
print(D)

# با scipy سریعتر می‌توان انجام داد
import scipy
# Thanks Gavin Heverly-Coulson (#issue 1)
import scipy.spatial

Z = np.random.random((10,2))
D = scipy.spatial.distance.cdist(Z,Z)
print(D)

۵۳. تبدیل آرایه عددی ممیز شناور ۳۲ بیتی به آرایه عددی صحیح ۳۲ بیتی:

Z = np.arange(10, dtype=np.int32)
Z = Z.astype(np.float32, copy=False)
print(Z)

۵۴. خواندن فایل به شکل زیر:

from io import StringIO

# Fake file 
s = StringIO("""1, 2, 3, 4, 5\n
                ۶,  ,  , ۷, ۸\n
                 ,  , ۹,۱۰,۱۱\n""")
Z = np.genfromtxt(s, delimiter=",", dtype=np.int)
print(Z)

۵۵. معادل enumerate برای آرایه های numpy:

Z = np.arange(9).reshape(3,3)
for index, value in np.ndenumerate(Z):
    print(index, value)
for index in np.ndindex(Z.shape):
    print(index, Z[index])

۵۶. ایجاد آرایه دو بعدی شبه گاوسی:

X, Y = np.meshgrid(np.linspace(-1,1,10), np.linspace(-1,1,10))
D = np.sqrt(X*X+Y*Y)
sigma, mu = 1.0, 0.0
G = np.exp(-( (D-mu)**2 / ( 2.0 * sigma**2 ) ) )
print(G)

۵۷. مقدار دهی تعداد p عنصر در مکانهای تصادفی در یک آرایه:

# Author: Divakar

n = 10
p = 3
Z = np.zeros((n,n))
np.put(Z, np.random.choice(range(n*n), p, replace=False),1)
print(Z)

۵۸. تفریق میانگین هر سطر از آن در آرایه دو بعدی:

# Author: Warren Weckesser

X = np.random.rand(5, 10)

# ویرایش جدید
Y = X - X.mean(axis=1, keepdims=True)

# ویرایشهای قدیمی
Y = X - X.mean(axis=1).reshape(-1, 1)

print(Y)

۵۹. مرتب سازی آرایه بر اساس ستون n ام:

# Author: Steve Tjoa

Z = np.random.randint(0,10,(3,3))
print(Z)
print(Z[Z[:,1].argsort()])

۶۰. آیا یک آرایه دو بعدی دارای ستون null می باشد:

# Author: Warren Weckesser

Z = np.random.randint(0,3,(3,10))
print((~Z.any(axis=0)).any())

۶۱. پیدا کردن نزدیکترین عدد به مقدار داده شده از بین عناصر آرایه:

Z = np.random.uniform(0,1,10)
z = 0.5
m = Z.flat[np.abs(Z - z).argmin()]
print(m)

۶۲. با فرض دو آرایه به فرم ۳×۱ و ۱×۳، محاسبه مجموع آنها با iterator:

A = np.arange(3).reshape(3,1)
B = np.arange(3).reshape(1,3)
it = np.nditer([A,B,None])
for x,y,z in it: z[...] = x + y
print(it.operands[2])

۶۳. ساخت یک کلاس آرایه با مؤلفه‌ای با نام name:

class NamedArray(np.ndarray):
    def __new__(cls, array, name="no name"):
        obj = np.asarray(array).view(cls)
        obj.name = name
        return obj
    def __array_finalize__(self, obj):
        if obj is None: return
        self.info = getattr(obj, 'name', "no name")

Z = NamedArray(np.arange(10), "range_10")
print (Z.name)

۶۴. فرض کنید یک بردار داریم و می خواهیم به درایه های مشخص شده در یک بردار دوم عدد یک را اضافه کنیم:

# Author: Brett Olsen

Z = np.ones(10)
I = np.random.randint(0,len(Z),20)
Z += np.bincount(I, minlength=len(Z))
print(Z)

# یک راه حل دیگر
# Author: Bartosz Telenczuk
np.add.at(Z, I, 1)
print(Z)

۶۵. پیدا کردن مجموع عناصر بردار X با توجه به لیست اندیس I:

# Author: Alan G Isaac

X = [1,2,3,4,5,6]
I = [1,3,9,3,4,1]
F = np.bincount(I,X)
print(F)

خروجی یک بردار خواهد بود که تعداد درایه‌های آن برابر ماکزیمم مقدار موجود در بردار I بعلاوه یک می باشد. درایه اندیسِ صفرِ بردارِ خروجی برابر مجموع درایه‌های بردار X که در بردار I عنصر متناظر برابر صفر می‌باشد، است. همانطور که مشاهده می‌گردد که چون در لیست I عدد صفر وجود ندارد در خروجی درایه اندیس صفرم، ۰ است. برای درایه اندیس یک با توجه به اینکه عنصر اول و آخر بردار I برابر عدد ۱ می باشد، خروجی برابر مجموع عنصر اول و آخر بردار X می‌باشد که ۷ می شود. برای عنصر درایه اندیس نهم خروجی چون در بردار I فقط عنصر اندیس ۲ برابر نُه است، مقدار عنصر اندیس ۲ در بردار X یعنی ۳ را خواهیم داشت.

۶۶. در کد زیر با فرض یک تصویر rgb با ابعاد wxhx3 تعداد رنگهای متمایز محاسبه گشته است:

# Author: Nadav Horesh

w,h = 16,16
I = np.random.randint(0,2,(h,w,3)).astype(np.ubyte)
F = I[...,0]*256*256 + I[...,1]*256 +I[...,2]
n = len(np.unique(F))
print(np.unique(I))

۶۷. یک آرایه چهار بعدی را در نظر بگیرید. می خواهیم بر روی دو محور آخر مجموع را محاسبه نماییم:

A = np.random.randint(0,10,(3,4,3,4))
# با استفاوه از یک چندتایی از اندیس محورها
sum = A.sum(axis=(-2,-1))
print(sum)
# راه حل با صاف کردن دو محور آخر در یکی
# قابل استفاده برای توابعی که اندیس محور را به شکل داده چندتایی نمی پذیرند
sum = A.reshape(A.shape[:-2] + (-1,)).sum(axis=-1)
print(sum)

۶۸. بردار یک بعدی D مفروض است. می خواهیم میانگین زیر مجموعه هایی از D را که با بردار هم اندازه S مشخص می گردد، حساب کنیم:

# Author: Jaime Fernández del Río

D = np.random.uniform(0,1,100)
S = np.random.randint(0,10,100)
D_sums = np.bincount(S, weights=D)
D_counts = np.bincount(S)
D_means = D_sums / D_counts
print(D_means)

# راه حل با استفاده از کتابخانه panda
import pandas as pd
print(pd.Series(D).groupby(S).mean())

۶۹. بدست آوردن قطر یک ضرب نقطه ای:

# Author: Mathieu Blondel

A = np.random.uniform(0,1,(5,5))
B = np.random.uniform(0,1,(5,5))

# روش یواش  
np.diag(np.dot(A, B))

# روش سریع
np.sum(A * B.T, axis=1)

# روش سریعتر
np.einsum("ij,ji->i", A, B)

۷۰. فرض کنید بردار اعداد بین یک تا پنج را داریم و می خواهیم بین هر عنصر این بردار سه تا صفر قرار دهیم:

# Author: Warren Weckesser

Z = np.array([1,2,3,4,5])
nz = 3
Z0 = np.zeros(len(Z) + (len(Z)-1)*(nz))
Z0[::nz+1] = Z
print(Z0)

۷۱. ضرب آرایه سه بعدی ۵x5x3 به آرایه دو بعدی ۵×۵:

A = np.ones((5,5,3))
B = 2*np.ones((5,5))
print(A * B[:,:,None])

۷۲. تعویض دو سطر یک آرایه:

# Author: Eelco Hoogendoorn

A = np.arange(25).reshape(5,5)
A[[0,1]] = A[[1,0]]
print(A)

۷۳. مجموعه ده سه تایی که ده مثلث را توصیف می‌کنند را در نظر بگیرید. مجموعه پاره خط های یکتایی که تمام مثلث ها را نشان می دهند اینطور پیدا می کنیم:

# Author: Nicolas P. Rougier

faces = np.random.randint(0,100,(10,3))
F = np.roll(faces.repeat(2,axis=1),-1,axis=1)
F = F.reshape(len(F)*3,2)
F = np.sort(F,axis=1)
G = F.view( dtype=[('p0',F.dtype),('p1',F.dtype)] )
G = np.unique(G)
print(G)

۷۴. فرض کنید آرایه C را که خروجی یک تابع bincount که قبلا دیدید است، داریم. آرایه A را طوری میسازیم که خروجی bincount(A) برابر C باشد:

# Author: Jaime Fernández del Río

C = np.bincount([1,1,2,3,4,4,6])
A = np.repeat(np.arange(len(C)), C)
print(A)

۷۵. محاسبه میانگین در یک پنجره که در طول آرایه حرکت می نماید:

# Author: Jaime Fernández del Río

def moving_average(a, n=3) :
    ret = np.cumsum(a, dtype=float)
    ret[n:] = ret[n:] - ret[:-n]
    return ret[n - 1:] / n
Z = np.arange(20)
print(moving_average(Z, n=3))

۷۶. فرض کنیم یک آرایه تک بعدی به اسم Z داریم. از روی این آرایه، آرایه دو بعدی را طوری می سازیم که سطر اول به شکل مثلا (Z[1], Z[2], Z[3]) باشد و هر سطر بعدی یک بار شیفت پیدا کند. در نهایت سطر آخر به شکل (Z[-3], Z[-2], Z[-1]) خواهد بود.

# Author: Joe Kington / Erik Rigtorp
from numpy.lib import stride_tricks

def rolling(a, window):
    shape = (a.size - window + 1, window)
    strides = (a.itemsize, a.itemsize)
    return stride_tricks.as_strided(a, shape=shape, strides=strides)
Z = rolling(np.arange(10), 3)
print(Z)

۷۷. عکس منطقی یک آرایه مقادیر صفر و یک و همچنین عوض کردن علامت یک آرایه از مقادیر ممیز شناور:

# Author: Nathaniel J. Smith

Z = np.random.randint(0,2,100)
np.logical_not(Z, out=Z)

Z = np.random.uniform(-1.0,1.0,100)
np.negative(Z, out=Z)

۷۸. فرض کنید دو مجموعه از نقاط P0 و P1 که خطوطی را مشخص می نمایند و یک نقطه p داریم. نحوه محاسبه فاصله نقطه p از خطوط:

def distance(P0, P1, p):
    T = P1 - P0
    L = (T**2).sum(axis=1)
    U = -((P0[:,0]-p[...,0])*T[:,0] + (P0[:,1]-p[...,1])*T[:,1]) / L
    U = U.reshape(len(U),1)
    D = P0 + U*T - p
    return np.sqrt((D**2).sum(axis=1))

P0 = np.random.uniform(-10,10,(10,2))
P1 = np.random.uniform(-10,10,(10,2))
p  = np.random.uniform(-10,10,( 1,2))
print(distance(P0, P1, p))

۷۹. فرض کنید دو مجموعه از نقاط P0 و P1 که خطوطی را مشخص می نمایند و یک مجموعه نقطه P داریم. نحوه محاسبه فاصله نقاط مجموعه P از خطوط:

# Author: Italmassov Kuanysh

# تابع فاصله در مثال قبلی در نوشتن این کد مورد استفاده قرار گرفته است
P0 = np.random.uniform(-10, 10, (10,2))
P1 = np.random.uniform(-10,10,(10,2))
p = np.random.uniform(-10, 10, (10,2))
print(np.array([distance(P0,P1,p_i) for p_i in p]))

۸۰. فرض کنید یک آرایه دلخواه داریم. رویه‌ای نوشته شده است که تکه هایی با شکل ثابت به مرکزیت عناصر دلخواه داده شده از این آرایه را جدا می کند:

# Author: Nicolas Rougier

Z = np.random.randint(0,10,(10,10))
shape = (5,5)
fill  = 0
position = (1,1)

R = np.ones(shape, dtype=Z.dtype)*fill
P  = np.array(list(position)).astype(int)
Rs = np.array(list(R.shape)).astype(int)
Zs = np.array(list(Z.shape)).astype(int)

R_start = np.zeros((len(shape),)).astype(int)
R_stop  = np.array(list(shape)).astype(int)
Z_start = (P-Rs//2)
Z_stop  = (P+Rs//2)+Rs%2

R_start = (R_start - np.minimum(Z_start,0)).tolist()
Z_start = (np.maximum(Z_start,0)).tolist()
R_stop = np.maximum(R_start, (R_stop - np.maximum(Z_stop-Zs,0))).tolist()
Z_stop = (np.minimum(Z_stop,Zs)).tolist()

r = [slice(start,stop) for start,stop in zip(R_start,R_stop)]
z = [slice(start,stop) for start,stop in zip(Z_start,Z_stop)]
R[r] = Z[z]
print(Z)
print(R)

۸۱. آرایه Z = [1,2,3,4,5,6,7,8,9,10,11,12,13,14] را فرض نمایید. چطور با استفاده از این آرایه، آرایه R = [[1,2,3,4], [2,3,4,5], [3,4,5,6], …, [۱۱,۱۲,۱۳,۱۴]] را ایجاد نماییم:

# Author: Stefan van der Walt

Z = np.arange(1,15,dtype=np.uint32)
R = stride_tricks.as_strided(Z,(11,4),(4,4))
print(R)

۸۲. محاسبه مرتبه یک ماتریس:

# Author: Stefan van der Walt

Z = np.random.uniform(0,1,(10,10))
U, S, V = np.linalg.svd(Z) # Singular Value Decomposition
rank = np.sum(S > 1e-10)
print(rank)

۸۳. پیدا کردن پر تکرارترین عنصر در یک آرایه:

Z = np.random.randint(0,10,50)
print(np.bincount(Z).argmax())

۸۴. استخراج تمامی ماتریسهای همجوار پیوسته ۳×۳ از یک ماتریس تصادفی ۱۰×۱۰:

# Author: Chris Barker

Z = np.random.randint(0,5,(10,10))
n = 3
i = 1 + (Z.shape[0]-3)
j = 1 + (Z.shape[1]-3)
C = stride_tricks.as_strided(Z, shape=(i, j, n, n), strides=Z.strides + Z.strides)
print(C)

۸۵. ایجاد یک کلاس از np.ndarray برای آرایه‌های دو بعدی متقارن:

# Author: Eric O. Lebigot
# تذکر: تنها برای آرایه‌های دو بعدی و مقداردهی آرایه با اندیسها درست کار می کند

class Symetric(np.ndarray):
    def __setitem__(self, index, value):
        i,j = index
        super(Symetric, self).__setitem__((i,j), value)
        super(Symetric, self).__setitem__((j,i), value)

def symetric(Z):
    return np.asarray(Z + Z.T - np.diag(Z.diagonal())).view(Symetric)

S = symetric(np.random.randint(0,10,(5,5)))
S[2,3] = 42
print(S)

۸۶. فرض کنید p ماتریس nxn و p بردار nx1 داریم. می خواهیم مجموع p ضرب ماتریسی را یکجا محاسبه نماییم:

# Author: Stefan van der Walt

p, n = 10, 20
M = np.ones((p,n,n))
V = np.ones((p,n,1))
S = np.tensordot(M, V, axes=[[0, 2], [0, 1]])
print(S)

۸۷. فرض کنید یک آرایه دو بعدی ۱۶×۱۶ داریم. می‌خواهیم مجموع بلوکهای ۴×۴ را محاسبه کرده و بجای بلوکها بنویسیم:

# Author: Robert Kern

Z = np.ones((16,16))
k = 4
S = np.add.reduceat(np.add.reduceat(Z, np.arange(0, Z.shape[0], k), axis=0),
                                       np.arange(0, Z.shape[1], k), axis=1)
print(S)

۸۸. پیاده سازی بازی زندگی! (Game of Life) با استفاده از آرایه‌های NumPy:

# Author: Nicolas Rougier

def iterate(Z):
    # Count neighbours
    N = (Z[0:-2,0:-2] + Z[0:-2,1:-1] + Z[0:-2,2:] +
         Z[1:-1,0:-2]                + Z[1:-1,2:] +
         Z[2:  ,0:-2] + Z[2:  ,1:-1] + Z[2:  ,2:])

    # Apply rules
    birth = (N==3) & (Z[1:-1,1:-1]==0)
    survive = ((N==2) | (N==3)) & (Z[1:-1,1:-1]==1)
    Z[...] = 0
    Z[1:-1,1:-1][birth | survive] = 1
    return Z

Z = np.random.randint(0,2,(50,50))
for i in range(100): Z = iterate(Z)
print(Z)

۸۹. پیدا کردن n عنصر بزرگتر یک آرایه:

Z = np.arange(10000)
np.random.shuffle(Z)
n = 5

# یواش
print (Z[np.argsort(Z)[-n:]])

# سریع
print (Z[np.argpartition(-Z,n)[:n]])

۹۰. ضرب کارتزین با تعداد دلخواهی از بردارها:

# Author: Stefan Van der Walt

def cartesian(arrays):
    arrays = [np.asarray(a) for a in arrays]
    shape = (len(x) for x in arrays)

    ix = np.indices(shape, dtype=int)
    ix = ix.reshape(len(arrays), -1).T

    for n, arr in enumerate(arrays):
        ix[:, n] = arrays[n][ix[:, n]]

    return ix

print (cartesian(([1, 2, 3], [4, 5], [6, 7])))

۹۱. ایجاد آرایه رکورد از یک آرایه معمولی:

Z = np.array([("Hello", 2.5, 3),
              ("World", 3.6, 2)])
R = np.core.records.fromarrays(Z.T, 
                               names='col1, col2, col3',
                               formats = 'S8, f8, i8')
print(R)

۹۲. آرایه با ابعاد بزرگ Z را در نظر بگیرید. می خواهیم Z بتوان سه را با سه روش محاسبه نماییم:

# Author: Ryan G.

x = np.random.rand(5e7)

%timeit np.power(x,3)
%timeit x*x*x
%timeit np.einsum('i,i,i->i',x,x,x)

دستوراتی که با علامت % شروع می شوند مخصوص ipython می باشند لذا در اجرای کدها دقت نظر داشته باشید. دستور timeit% برای محاسبه زمان اجرای یک دستور مورد استفاده قرار می‌گیرد.

۹۳. دو آرایه A و B را با ابعاد ۸×۳ و ۲×۲ در نظر بگیرید. چطور سطرهای A را که شامل عناصر هر سطر B بدون در نظر گرفتن ترتیب عناصر می‌باشد، پیدا کنیم:

# Author: Gabe Schwartz

A = np.random.randint(0,5,(8,3))
B = np.random.randint(0,5,(2,2))

C = (A[..., np.newaxis, np.newaxis] == B)
rows = np.where(C.any((3,1)).all(1))[0]
print(rows)

۹۴. آرایه دو بعدی ۱۰×۳ را در نظر بگیرید. می خواهیم سطرهایی که دارای عناصر نامساوی هستند پیدا کنیم:

# Author: Robert Kern

Z = np.random.randint(0,5,(10,3))
print(Z)
# solution for arrays of all dtypes (including string arrays and record arrays)
E = np.all(Z[:,1:] == Z[:,:-1], axis=1)
U = Z[~E]
print(U)
# soluiton for numerical arrays only, will work for any number of columns in Z
U = Z[Z.max(axis=1) != Z.min(axis=1),:]
print(U)

۹۵. تبدیل برداری از اعداد صحیح به ماتریسی از نمایش دودویی:

# Author: Warren Weckesser

I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128])
B = ((I.reshape(-1,1) & (2**np.arange(8))) != 0).astype(int)
print(B[:,::-1])

# Author: Daniel T. McDonald

I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128], dtype=np.uint8)
print(np.unpackbits(I[:, np.newaxis], axis=1))

۹۶. استخراج سطرهای یکتا از آرایه دو بعدی:

# Author: Jaime Fernández del Río

Z = np.random.randint(0,2,(6,3))
T = np.ascontiguousarray(Z).view(np.dtype((np.void, Z.dtype.itemsize * Z.shape[1])))
_, idx = np.unique(T, return_index=True)
uZ = Z[idx]
print(uZ)

۹۷. دو بردار A و  B را در نظر بگیرید. معادل einsum توابع inner، outer، sum و mul را بدست بیاورید:

# Author: Alex Riley
# حتما این متن را بخوانید: http://ajcr.net/Basic-guide-to-einsum/

A = np.random.uniform(0,1,10)
B = np.random.uniform(0,1,10)

np.einsum('i->', A)       # np.sum(A)
np.einsum('i,i->i', A, B) # A * B
np.einsum('i,i', A, B)    # np.inner(A, B)
np.einsum('i,j->ij', A, B)    # np.outer(A, B)

۹۸. یک مسیر را که با دو بردار X و Y نمایش داده شده است فرض کنید. می خواهیم این مسیر را به شکل متساوی الفاصله نمونه برداری کنیم:

# Author: Bas Swinckels

phi = np.arange(0, 10*np.pi, 0.1)
a = 1
x = a*phi*np.cos(phi)
y = a*phi*np.sin(phi)

dr = (np.diff(x)**2 + np.diff(y)**2)**.5 # segment lengths
r = np.zeros_like(x)
r[1:] = np.cumsum(dr)                # integrate path
r_int = np.linspace(0, r.max(), 200) # regular spaced path
x_int = np.interp(r_int, r, x)       # integrate path
y_int = np.interp(r_int, r, y)

۹۹. عدد صحیح n و آرایه دو بعدی X را داریم. سطرهایی از X که می تواند بعنوان حاصله از یک توزیع چندجمله‌ای مرتبه n تفسیر گردد، انتخاب کن! یعنی سطرهایی که تنها شامل اعداد صحیح با مجموع برابر n هستند:

# Author: Evgeni Burovski

X = np.asarray([[1.0, 0.0, 3.0, 8.0],
                [۲٫۰, ۰٫۰, ۱٫۰, ۱٫۰],
                [۱٫۵, ۲٫۵, ۱٫۰, ۰٫۰]])
n = 4
M = np.logical_and.reduce(np.mod(X, 1) == 0, axis=-1)
M &= (X.sum(axis=-1) == n)
print(X[M])

۱۰۰. محاسبه بازه اطمینان بوت استرپ شده ۹۵% برای میانگین یک آرایه تک بعدی X (نمونه برداری دوباره عناصر یک آرایه با N بار جاگذاری، محاسبه میانگین هر نمونه و محاسبه صدکها بر اساس میانگین):

# Author: Jessica B. Hamrick

X = np.random.randn(100) # random 1D array
N = 1000 # number of bootstrap samples
idx = np.random.randint(0, X.size, (N, X.size))
means = X[idx].mean(axis=1)
confint = np.percentile(means, [2.5, 97.5])
print(confint)

 

این نوشته ترجمه و تکمیلی از نوشته موجود در آدرس زیر می باشد:

http://www.labri.fr/perso/nrougier/teaching/numpy-100.html