Hoán vị ngẫu nhiên trong NumpyNội Dung Show
Trong toán học, hoán vị là mỗi cách sắp xếp n phần tử của tập hợp A theo một thứ tự nào đó được gọi là một hoán vị của n phần tử trong tập A. Trong mảng Numpy, một hoán vị đề cập đến một sự sắp xếp của các phần tử thuộc trong mảng.Ví dụ [3, 2, 1] là hoán vị của [1, 2, 3] và ngược lại. Mô-đun Numpy cung cấp hai hàm thường được sử dụng cho hoán vị phần tử trong mảng Numpy đó là:
2. Xáo trộn phần tử trong mảngViệc xáo trộn các phần tử trong mảng có nghĩa là thực hiện đổi lại vị trí của các phần tử ban đầu thành các vị trí khác ngẫu nhiên trong mảng. Để làm được việc này, chúng ta cần sử dụng hàm random.shuffle() – hàm này nhận vào một mảng ban đầu và thực hiện xáo trộn các vị trí phần tử trong mảng. Ví dụ dưới đây, sử dụng hàm random.shuffle() để xáo trộn các vị trí phần tử có trong mảng 1 chiều như sau: from numpy import random import numpy as np arr = np.array([1, 2, 3, 4, 5]) random.shuffle(arr) print(arr) Kết quả: [4 2 5 3 1] Lưu ý: Khi thực thi lại chương trình, một mảng với các phần tử tại ví trị mới sẽ được tạo ra. Tương tự như mảng 1 chiều, ta cũng có thể sử dụng hàm random.shuffle() để xáo trộn vị trí phần tử có trong mảng 2 chiều như sau: from numpy import random import numpy as np arr = np.array([ [1, 2, 3], [4, 5, 0], [8, 2, 6], [1, 7, 4], [5, 2, 9] ]) random.shuffle(arr) print(arr) Kết quả: [[5 2 9] [4 5 0] [1 7 4] [1 2 3] [8 2 6]] Lưu ý: Vì trong mảng 2 chiều, các phần tử sẽ là mảng 1 chiều. Vậy nên, khi xáo trộn các vị trí phần tử có trong mảng 2 chiều thì việc này thực chất là xáo trộn các mảng 1 chiều thuộc trong mảng 2 chiều ban đầu. 3. Tạo hoán vị phần tử trong mảngChúng ta có thể tạo ra một mảng hoán vị từ một mảng ban đầu thông qua hàm random.permutation() – hàm này truyền vào một mảng cần hoán vị và thực hiện hoán vị ngẫu nhiên một dãy hoặc trả về một dãy đã hoán vị. Nếu mảng nhập vào hàm random.permutation() là một mảng nhiều chiều, nó chỉ được hoán vị dọc trục mà ta chỉ định cho nó (trục dọc hoặc trục ngang) Ví dụ dưới đây, tạo hoán vị ngẫu nhiên các phần tử của mảng 1 chiều bằng cách sử dụng hàm random.permutation() như sau: from numpy import random import numpy as np arr = np.array([1, 2, 3, 4, 5]) print(random.permutation(arr)) Kết quả: [1 5 3 2 4] Ví dụ tiếp theo, tạo hoán vị ngẫu nhiên các phần tử trong mảng 2 chiều dựa theo trục dọc bằng cách sử dụng hàm random.permutation() như sau: from numpy import random import numpy as np arr = np.array([ [1, 2, 3], [4, 5, 0], [8, 2, 6], [1, 7, 4], [5, 2, 9] ]) print(random.permutation(arr)) Kết quả: [[4 5 0] [8 2 6] [1 2 3] [5 2 9] [1 7 4]] Ngẫu nhiên là một mô-đun có trong thư viện NumPy. Mô-đun này chứa các hàm được sử dụng để tạo số ngẫu nhiên. Mô-đun này chứa một số phương pháp tạo dữ liệu ngẫu nhiên đơn giản, một số hàm hoán vị và phân phối cũng như các hàm tạo ngẫu nhiên. Các bài viết liên quan: Tất cả các chức năng trong một mô-đun ngẫu nhiên như sau: Random dataDữ liệu ngẫu nhiên đơn giản có các chức năng sau:
Chức năng này của mô-đun ngẫu nhiên được sử dụng để tạo ra các số hoặc giá trị ngẫu nhiên trong một hình dạng nhất định. Thí dụ: import numpy as np a=np.random.rand(5,2) a Output:
Hàm này của mô-đun ngẫu nhiên trả về một mẫu từ phân phối “chuẩn thông thường”. Thí dụ: import numpy as np a=np.random.randn(2,2) a Output:
Chức năng này của mô-đun ngẫu nhiên được sử dụng để tạo ra các số nguyên ngẫu nhiên từ bao gồm (thấp) đến loại trừ (cao). Thí dụ: import numpy as np a=np.random.randint(3, size=10) a Output:
Hàm này của mô-đun ngẫu nhiên được sử dụng để tạo số nguyên ngẫu nhiên kiểu np.int giữa thấp và cao. Thí dụ: import numpy as np a=np.random.random_integers(3) a b=type(np.random.random_integers(3)) b c=np.random.random_integers(5, size=(3,2)) c Output:
Chức năng này của mô-đun ngẫu nhiên được sử dụng để tạo số lượng phao ngẫu nhiên trong khoảng thời gian nửa mở [0.0, 1.0). Thí dụ: import numpy as np a=np.random.random_sample() a b=type(np.random.random_sample()) b c=np.random.random_sample((5,)) c Output:
Chức năng này của mô-đun ngẫu nhiên được sử dụng để tạo số lượng phao ngẫu nhiên trong khoảng thời gian nửa mở [0.0, 1.0). Thí dụ: import numpy as np a=np.random.random() a b=type(np.random.random()) b c=np.random.random((5,)) c Output:
Chức năng này của mô-đun ngẫu nhiên được sử dụng để tạo số lượng phao ngẫu nhiên trong khoảng thời gian nửa mở [0.0, 1.0). Thí dụ: import numpy as np a=np.random.ranf() a b=type(np.random.ranf()) b c=np.random.ranf((5,)) c Output:
Chức năng này của mô-đun ngẫu nhiên được sử dụng để tạo số lượng phao ngẫu nhiên trong khoảng thời gian nửa mở [0.0, 1.0). Các bài viết khác: Thí dụ: import numpy as np a=np.random.sample() a b=type(np.random.sample()) b c=np.random.sample((5,)) c Output:
Chức năng này của mô-đun ngẫu nhiên được sử dụng để tạo mẫu ngẫu nhiên từ một mảng 1-D nhất định. Thí dụ: import numpy as np a=np.random.choice(5,3) a b=np.random.choice(5,3, p=[0.2, 0.1, 0.4, 0.2, 0.1]) b Output:
Chức năng này của mô-đun ngẫu nhiên được sử dụng để tạo ra các byte ngẫu nhiên. Thí dụ: import numpy as np a=np.random.bytes(7) a Output: Hoán vịCó các chức năng sau của hoán vị:
Hàm này được sử dụng để sửa đổi một trình tự tại chỗ bằng cách xáo trộn nội dung của nó. Thí dụ: import numpy as np a=np.arange(12) a np.random.shuffle(a) a Output:
Hàm này hoán vị một dãy ngẫu nhiên hoặc trả về một dãy đã hoán vị. Thí dụ: import numpy as np a=np.random.permutation(12) a Output: Phân phốiCó các chức năng sau của hoán vị:
Hàm này được sử dụng để vẽ mẫu từ bản phân phối Beta. Thí dụ: def setup(self): self.dist = dist.beta self.cargs = [] self.ckwd = dict(alpha=2, beta=3) self.np_rand_fxn = numpy.random.beta self.np_args = [2, 3] self.np_kwds = dict()
Hàm này được sử dụng để lấy mẫu từ một phân phối nhị thức. Thí dụ: import numpy as np n, p = 10, .6 s1= np.random.binomial(n, p, 10) s1 Output:
Hàm này được sử dụng để lấy mẫu từ một phân phối nhị thức. Thí dụ: import numpy as np np.random.chisquare(2,4) sum(np.random.binomial(9, 0.1, 20000) == 0)/20000. Output:
Hàm này được sử dụng để vẽ một mẫu từ phân phối Dirichlet. Thí dụ: Import numpy as np import matplotlib.pyplot as plt s1 = np.random.dirichlet((10, 5, 3), 20).transpose() plt.barh(range(20), s1[0]) plt.barh(range(20), s1[1], left=s1[0], color='g') plt.barh(range(20), s1[2], left=s1[0]+s1[1], color='r') plt.title("Lengths of Strings") plt.show() Output:
Hàm này được sử dụng để lấy mẫu từ phân phối hàm mũ. Thí dụ: def __init__(self, sourceid, targetid): self.__type = 'Transaction' self.id = uuid4() self.source = sourceid self.target = targetid self.date = self._datetime.date(start=2015, end=2019) self.time = self._datetime.time() if random() < 0.05: self.amount = self._numbers.between(100000, 1000000) self.amount = npr.exponential(10) if random() < 0.15: self.currency = self._business.currency_iso_code() else: self.currency = None
Hàm này được sử dụng để lấy mẫu từ phân phối F. Thí dụ: import numpy as np dfno= 1. dfden = 48. s1 = np.random.f(dfno, dfden, 10) np.sort(s1) Output:
Hàm này được sử dụng để lấy mẫu từ phân phối Gamma Thí dụ: import numpy as np shape, scale = 2., 2. s1 = np.random.gamma(shape, scale, 1000) import matplotlib.pyplot as plt import scipy.special as spss count, bins, ignored = plt.hist(s1, 50, density=True) a = bins**(shape-1)*(np.exp(-bins/scale) / (spss.gamma(shape)*scale**shape)) plt.plot(bins, a, linewidth=2, color='r') plt.show()
Hàm này được sử dụng để lấy mẫu từ một phân bố hình học. Thí dụ: import numpy as np a = np.random.geometric(p=0.35, size=10000) (a == 1).sum() / 1000 Output:
Hàm này được sử dụng để lấy mẫu từ phân phối Gumble. Thí dụ: import numpy as np lov, scale = 0, 0.2 s1 = np.random.gumbel(loc, scale, 1000) import matplotlib.pyplot as plt count, bins, ignored = plt.hist(s1, 30, density=True) plt.plot(bins, (1/beta)*np.exp(-(bins - loc)/beta)* np.exp( -np.exp( -(bins - loc) /beta) ),linewidth=2, color='r') plt.show() Output:
Hàm này được sử dụng để lấy mẫu từ phân phối Hypergeometric. Thí dụ: import numpy as np good, bad, samp = 100, 2, 10 s1 = np.random.hypergeometric(good, bad, samp, 1000) plt.hist(s1) plt.show() Output:
Hàm này được sử dụng để lấy mẫu từ phân phối Laplace hoặc phân phối hàm mũ kép với vị trí và tỷ lệ xác định. Thí dụ: import numpy as np location, scale = 0., 2. s = np.random.laplace(location, scale, 10) s Output:
Chức năng này được sử dụng để lấy mẫu từ phân phối logistic. Thí dụ: import numpy as np import matplotlib.pyplot as plt location, scale = 10, 1 s1 = np.random.logistic(location, scale, 10000) count, bins, ignored = plt.hist(s1, bins=50) count bins ignored plt.show() Output:
Hàm này được sử dụng để lấy mẫu từ phân phối log-chuẩn. Thí dụ: import numpy as np mu, sigma = 2., 1. s1 = np.random.lognormal(mu, sigma, 1000) import matplotlib.pyplot as plt count, bins, ignored = plt.hist(s1, 100, density=True, align='mid') a = np.linspace(min(bins), max(bins), 10000) pdf = (np.exp(-(np.log(a) - mu)**2 / (2 * sigma**2))/ (a * sigma * np.sqrt(2 * np.pi))) plt.plot(a, pdf, linewidth=2, color='r') plt.axis('tight') plt.show() Output: 14) logseries (p [, size]) Hàm này được sử dụng để lấy mẫu từ phân phối logarit. Thí dụ: import numpy as np x = .6 s1 = np.random.logseries(x, 10000) count, bins, ignored = plt.hist(s1) def logseries(k, p): return -p**k/(k*log(1-p)) plt.plot(bins, logseries(bins, x)*count.max()/logseries(bins, a).max(), 'r') plt.show() Output:
Hàm này được sử dụng để lấy mẫu từ một phân phối đa thức. Thí dụ: import numpy as np np.random.multinomial(20, [1/6.]*6, size=1) Output:
Hàm này được sử dụng để lấy mẫu từ phân phối chuẩn đa biến. Thí dụ: import numpy as np mean = (1, 2) coveriance = [[1, 0], [0, 100]] import matplotlib.pyplot as plt a, b = np.random.multivariate_normal(mean, coveriance, 5000).T plt.plot(a, b, 'x') plt.axis('equal'023 030 ) plt.show() Output:
Hàm này được sử dụng để lấy mẫu từ phân phối nhị thức âm. Thí dụ: import numpy as np s1 = np.random.negative_binomial(1, 0.1, 100000) for i in range(1, 11): probability = sum(s1<i) / 100000. print i, "wells drilled, probability of one success =", probability Output:
Hàm này được sử dụng để lấy mẫu từ phân phối chi bình phương không trung tâm. Thí dụ: import numpy as np import matplotlib.pyplot as plt val = plt.hist(np.random.noncentral_chisquare(3, 25, 100000), bins=200, normed=True) plt.show() Output:
Hàm này được sử dụng để lấy mẫu từ phân phối chuẩn. Thí dụ: import numpy as np import matplotlib.pyplot as plt mu, sigma = 0, 0.2 # mean and standard deviation s1 = np.random.normal(mu, sigma, 1000) abs(mu - np.mean(s1)) < 0.01 abs(sigma - np.std(s1, ddof=1)) < 0.01 count, bins, ignored = plt.hist(s1, 30, density=True) plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) *np.exp( - (bins - mu)**2 / (2 * sigma**2) ), linewidth=2, color='r') plt.show() Output:
Chức năng này được sử dụng để vẽ các mẫu từ Lomax hoặc Pareto II với hình dạng được chỉ định. Thí dụ: import numpy as np import matplotlib.pyplot as plt b, m1 = 3., 2. # shape and mode s1 = (np.random.pareto(b, 1000) + 1) * m1 count, bins, _ = plt.hist(s1, 100, density=True) fit = b*m**b / bins**(b+1) plt.plot(bins, max(count)*fit/max(fit), linewidth=2, color='r') plt.show() Output:
Hàm này được sử dụng để vẽ các mẫu trong [0, 1] từ phân phối lũy thừa với số mũ dương a-1. Thí dụ: import numpy as np x = 5. # shape samples = 1000 s1 = np.random.power(x, samples) import matplotlib.pyplot as plt count, bins, ignored = plt.hist(s1, bins=30) a = np.linspace(0, 1, 100) b = x*a**(x-1.) density_b = samples*np.diff(bins)[0]*b plt.plot(a, density_b) plt.show() Output:
Hàm này được sử dụng để lấy mẫu từ phân phối Rayleigh. Thí dụ: val = hist(np.random.rayleigh(3, 100000), bins=200, density=True) meanval = 1 modeval = np.sqrt(2 / np.pi) * meanval s1 = np.random.rayleigh(modeval, 1000000) 100.*sum(s1>3)/1000000. Output:
Hàm này được sử dụng để lấy mẫu từ phân phối Cauchy tiêu chuẩn với mode = 0. Thí dụ: import numpy as np import matplotlib.pyplot as plt s1 = np.random.standard_cauchy(1000000) s1 = s1[(s1>-25) & (s1<25)] # truncate distribution so it plots well plt.hist(s1, bins=100) plt.show() Output:
Hàm này được sử dụng để lấy mẫu từ phân phối mũ tiêu chuẩn. Thí dụ: import numpy as np n = np.random.standard_exponential((2, 7000)) Output:
Hàm này được sử dụng để lấy mẫu từ phân phối Gamma chuẩn. Thí dụ: import numpy as np shape, scale = 2., 1. s1 = np.random.standard_gamma(shape, 1000000) import matplotlib.pyplot as plt import scipy.special as sps count1, bins1, ignored1 = plt.hist(s, 50, density=True) y = bins1**(shape-1) * ((np.exp(-bins1/scale))/ (sps.gamma(shape) * scale**shape)) plt.plot(bins1, y, linewidth=2, color='r') plt.show() Output:
Hàm này được sử dụng để lấy mẫu từ một phân phối Chuẩn chuẩn. Thí dụ: import numpy as np import matplotlib.pyplot as plt s1= np.random.standard_normal(8000) s1 q = np.random.standard_normal(size=(3, 4, 2)) q Đầu ra:
Hàm này được sử dụng để lấy mẫu từ phân phối Student chuẩn với bậc tự do df. Thí dụ: intake = np.array([5260., 5470, 5640, 6180, 6390, 6515, 6805, 7515,8230,8770]) s1 = np.random.standard_t(10, size=100000) np.mean(intake) intake.std(ddof=1) t = (np.mean(intake)-7725)/(intake.std(ddof=1)/np.sqrt(len(intake))) h = plt.hist(s1, bins=100, density=True) np.sum(s1<t) / float(len(s1)) plt.show() Output:
Hàm này được sử dụng để lấy mẫu từ một phân bố tam giác trong khoảng thời gian. Thí dụ: import numpy as np import matplotlib.pyplot as plt h = plt.hist(np.random.triangular(-4, 0, 8, 1000000), bins=300,density=True) plt.show() Output:
Chức năng này được sử dụng để lấy mẫu từ một phân phối đồng đều. Thí dụ: import numpy as np import matplotlib.pyplot as plt s1 = np.random.uniform(-1,0,1000) np.all(s1 >= -1) np.all(s1 < 0) count, bins, ignored = plt.hist(s1, 15, density=True) plt.plot(bins, np.ones_like(bins), linewidth=2, color='r') plt.show() Output:
Hàm này được sử dụng để lấy mẫu từ phân phối von Mises. Thí dụ: import numpy as np import matplotlib.pyplot as plt m1, m2 = 0.0, 4.0 s1 = np.random.vonmises(m1, m2, 1000) from scipy.special import i0 plt.hist(s1, 50, density=True) x = np.linspace(-np.pi, np.pi, num=51) y = np.exp(m2*np.cos(x-m1))/(2*np.pi*i0(m2)) plt.plot(x, y, linewidth=2, color='r') plt.show() Output:
Hàm này được sử dụng để lấy mẫu từ phân phối Wald, hoặc nghịch đảo Gaussian. Thí dụ: import numpy as np import matplotlib.pyplot as plt h = plt.hist(np.random.wald(3, 3, 100000), bins=250, density=True) plt.show() Output:
Hàm này được sử dụng để lấy mẫu từ phân phối Weibull. Thí dụ: import numpy as np import matplotlib.pyplot as plt from scipy import special x=2.0 s=np.random.weibull(x, 1000) a = np.arange(1, 100.)/50. def weib(x, n, a): return (a/n)*(x/n)**np.exp(-(x/n)**a) count, bins, ignored = plt.hist(np.random.weibull(5.,1000)) a= np.arange(1,100.)/50. scale = count.max()/weib(x, 1., 5.).max() scale = count.max()/weib(a, 1., 5.).max() plt.plot(x, weib(x, 1., 5.)*scale) plt.show() Output:
Hàm này được sử dụng để lấy mẫu từ phân phối Zipf. Thí dụ: import numpy as np import matplotlib.pyplot as plt from scipy import special x=2.0 s=np.random.zipf(x, 1000) count, bins, ignored = plt.hist(s[s<50], 50, density=True) a = np.arange(1., 50.) b= a**(-x) / special.zetac(x) plt.plot(a, b/max(b), linewidth=2, color='r') plt.show() Output: |