--------------- <> -----------------
--- KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM ---
--- Học để đi cùng bà con trên thế giới ---

Tìm kiếm trong Blog

Hiển thị các bài đăng có nhãn Học máy. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Học máy. Hiển thị tất cả bài đăng

Hoc may voi Python (3)

(Tiếp theo của học máy với Python 2)



Lựa chọn mô hình và giải thuật phù hợp


Tới đây, bạn đã có những ấn tượng, những cảm nhận ban đầu về dữ liệu. Tuy nhiên, yêu cầu đặt ra cho ứng dụng này là chúng ta phải dự báo “khi nào thì số lượng truy cập sẽ chạm ngưỡng 100 000 lần/giờ? hay dự báo khi nào sẽ phải nâng cấp hệ thống?”

Để trả lời câu hỏi này, cần phải giải quyết hai vấn đề sau:
­ 
- Tìm ra mô hình phù hợp dựa trên các dữ liệu đã quan sát được. (Nói nôm na là tìm ra được một biểu thức thể hiện mối liên hệ giữa x và y). 

- Sử dụng mô hình để dự báo: thời điểm nào thì số lượng truy cập sẽ chạm ngưỡng 100 000 lần/giờ?

Khi nói về mô hình (model), bạn có thể nghĩ đến một mô phỏng của thế giới thật, tất nhiên, nó mang tính giả định và đã được đơn giản hóa. Mô hình luôn luôn có độ sai khác so với thực tế, còn được gọi là sai số xấp xỉ (approximate error). Sai  số xấp xỉ chính là một tiêu chí giúp chúng ta đánh giá được mô hình nào là phù hợp với bài toán. Sai số xấp xỉ được tính bằng bình phương khoảng cách (squared distance) giữa dữ liệu thật (quan sát được) và kết quả dự báo của mô hình.

Giả sử f là hàm số của mô hình, để tính sai số, chúng ta định nghĩa hàm error để tính sai số như sau:

Def error (f, x, y): return sp.sum((f(x) – y ** 2)

Trong đó, x và y là hai vector chứa dữ liệu (x: giờ, y: số lần truy cập) đã quan sát được; f là hàm số chúng ta đã rút trích được từ dữ liệu, đó chính là hàm mô phỏng mối liên hệ giữa x và y.

 

Bắt đầu với mô hình đường thẳng đơn giản


Giả sử mô hình cho bài toán chúng ta đang xem xét là một đường thẳng, viết dưới dạng biểu thức (hàm số) sẽ là y = ax + b. Khi đó, vấn đề cần quan tâm tiếp theo là sẽ đặt đường thẳng này theo vị trí nào để sai số xấp xỉ là nhỏ nhất. Hàm polyfit() của SciPy sẽ giúp bạn thực hiện điều này.

Với dữ liệu đầu vào là các giá trị đã quan sát được của x, y, cộng với bậc của đa thức cần tìm (vì là đường thẳng, nên bậc của đa thức là bậc 1), hàm polyfit() sẽ tìm ra được hàm số của mô hình, với sai số xấp xỉ là nhỏ nhất.

Cú pháp của hàm polyfit():

fp1, residuals, rank, sv, rcond = sp.polyfit(x, y, 1, full = True)

Hàm polyfit() sẽ trả về các tham số của hàm fp1; với tham số full = True, hàm polyfit() cũng sẽ cung cấp thêm cho chúng ta các thông tin liên quan khác. Trong các thông tin liên quan khác, bạn sẽ quan tâm tới giá trị của residuals, đây là sai số giữa các giá trị y quan sát và các giá trị y dự báo của mô hình.

Chạy thử trên SciPy:

In [1]: import scipy as sp
In [2]: data = sp.genfromtxt("D:\Liv\Re\Ebooks\ML\web_traffic.tsv", delimiter="\t")
In [3]: x = data[:,0]
In [4]: y = data[:,1]
In [5]: x = x[~sp.isnan(y)]
In [6]: y = y[~sp.isnan(y)]
In [7]: fp1, residuals, rank, sv, rcond = sp.polyfit(x, y, 1, full = True)
In [8]: print ("Cac tham so cua mo hinh: %s" % fp1)
Cac tham so cua mo hinh: [ 2.59619213       989.02487106]
In [10]: print(residuals)
[ 3.17389767e+08]

Vậy hàm số (hay đường thẳng) chúng ta cần tìm có dạng:

y = f(x) = 2.59619213* x + 989.02487106

Dựa vào các tham số trả về của polyfit(), sử dụng hàm poly1d() của SciPy để tạo ra hàm số của mô hình.

In [11]: f1 = sp.poly1d(fp1)

Định nghĩa hàm error (), để tính và  xuất sai số xấp xỉ của hàm số mô hình.

In [14]: def error(f, x, y):return sp.sum((f(x) - y)**2)
In [15]: print (error(f1, x, y))
317389767.34

Chúng ta sẽ biểu diễn dữ liệu đã quan sát và mô hình đường thẳng vừa tìm được.

Đầu tiên, chúng ta sẽ biểu diễn dữ liệu đã quan sát dưới dạng đồ thị không gian hai chiều (xem lại bài viết số 2).

Tiếp theo, chúng ta thực hiện vẽ đường thẳng của mô hình.

In [25]: fx = sp.linspace(0, x[-1], 1000) # tao cac gia tri tren truc X
In [26]: plt.plot(fx, f1(fx), linewidth=4)
Out[26]: [<matplotlib.lines.Line2D at 0x66d7890>]
In [27]: plt.legend(["Bac = %i" % f1.order], loc = "upper left")
Out[27]: <matplotlib.legend.Legend at 0x66d7eb0>

Kết quả:



Quan sát đường thẳng trên đồ thị, bạn sẽ nhận thấy bước sang tuần thứ năm thì mô hình đã thể hiện sai rất nhiều so với quan sát thực tế. Ngoài ra, với sai số xấp xỉ là 317389767,34, bạn cũng không biết là nó có phải là một mô hình phù hợp nhất hay không?

Giá trị tuyệt đối của sai số rất ít khi được sử dụng riêng biệt. Tuy nhiên, khi thực hiện so sánh giữa hai mô hình, thì bạn có thể sử dụng nó để đánh giá xem mô hình nào phù hợp hơn.

Mặc dù chúng ta sẽ không sử dụng mô hình đường thẳng này để dự đoán, nhưng nó sẽ là mô hình xuất phát, làm cơ sở để chúng ta tìm các mô hình khác phù hợp hơn. Các mô hình chúng ta tìm ra sau này sẽ được so sánh với mô hình xuất phát.

 

Tăng thêm độ phức tạp của mô hình


Chúng ta sẽ chọn một mô hình khác phức tạp hơn, đó là một đa thức bậc 2. Chúng ta sẽ xem đa thức bậc 2 này có mô phỏng dữ liệu tốt hơn hay không.

Hàm số bậc 2 có dạng: y = ax**2 + bx + c.

Rút trích hàm số bậc 2 từ dữ liệu quan sát:

In [28]: f2p = sp.polyfit(x, y, 2)

Xuất kết quả:

In [29]: print(f2p)
[ 1.05322215e-02       -5.26545650e+00      1.97476082e+03]

Vậy hàm số bậc 2 rút trích được là:

y  =  f(x) = 0,0105322215*x**2  - 5.26545650*x + 1974,76082

Sai số xấp xỉ của hàm số:

In [30]: f2=sp.poly1d(f2p)
In [31]: print(error(f2, x, y))
179983507.878

Vẽ đồ thị của hàm số bậc 2 (đường nét đứt, màu đỏ):

Để đỡ phải gõ lại các dòng lệnh, bạn có thể viết riêng đoạn mã vẽ đồ thị. Để thực hiện, bạn chạy phần mềm Enthought Canopy, chọn Editor, chọn Create a new file, nhập vào đoạn mã cần thực thi, lưu lại, bấm Run\Run file để xem kết quả.

import scipy as sp
import matplotlib.pyplot as plt

# Nhap du lieu tu tap tin
data = sp.genfromtxt("D:\Liv\Re\Ebooks\ML\web_traffic.tsv", delimiter="\t")

# Tao hai vector du lieu
x = data[:,0]
y = data[:,1]

# Loai bo cac gia tri NAN
x = x[~sp.isnan(y)]
y = y[~sp.isnan(y)]

# tao cac gia tri tren truc X cho cac mo hinh
fx = sp.linspace(0, x[-1], 1000)

# Chuan bi ve duong 1
fp1 = sp.polyfit(x, y, 1)
f1 = sp.poly1d(fp1)
plt.plot(fx, f1(fx), label = 'Bac = 1', linewidth=4)

# Chuan bi ve duong 2
fp2 = sp.polyfit(x, y, 2)
f2 = sp.poly1d(fp2)
plt.plot(fx, f2(fx), 'r--', label = 'Bac = 2', linewidth=4)

# Hien thi ket qua
plt.scatter(x,y)
plt.title("Luu luong truy cap web")
plt.xlabel("Thoi gian")
plt.ylabel("Truy cap/gio")
plt.xticks([w*7*24 for w in range(5)],['Tuan %i'%(w+1) for w in range(5)])
plt.autoscale(tight=True)
plt.grid()
plt.legend(loc='upper left')
plt.show()
Kết quả:




--------------------------
Tham khảo (lược dịch)
Willi Richert, Luis Pedro Coelho, Building Machine Learning Systems with Python, PACKT publishing, 2013
--------------------------
Cập nhật (2015/2/3)
--------------------------
Đọc thêm
Hoc may voi Python (4)
 

Hoc may voi Python (2)

(Tiếp theo của học máy với Python 1)



Xử lý tình trạng thiếu dữ liệu

Khi đọc dữ liệu từ tập tin dạng văn bản (text), sẽ xảy ra tình trạng có những chỗ dữ liệu không hợp lệ. Trong trường hợp đó, NumPy cho phép đánh dấu chỗ dữ liệu bị thiếu bằng kí hiệu numpy.NAN.

In [3]: c = np.array([1,2,np.NAN,3,4]) # giả sử dữ liệu này vừa được nhập từ tập tin dữ liệu
In [4]: c
Out[4]: array([ 1., 2., nan, 3., 4.])
In [5]: np.isnan(c) # kiểm tra phần tử chứa giá trị NAN
Out[5]: array([False, False, True, False, False], dtype=bool)
In [6]: c[~np.isnan(c)] # mảng các phần tử không bao gồm NAN
Out[6]: array([ 1., 2., 3., 4.])
In [7]: np.mean(c[~np.isnan(c)]) # mean( ): hàm tính giá trị trung bình
Out[7]: 2.5s

So sánh thời gian xử lý

Ví dụ sau thực hiện so sánh thời gian xử lý giữa NumPy và Python. Nội dung công việc là tính tổng bình phương các số từ 1 tới 1000, thực hiện 10000 lần và đo tổng thời gian cần thiết để thực hiện.

In [1]: import timeit
In [2]: normal_py_sec = timeit.timeit('sum(x*x for x in xrange (1000))', number=10000)
In [4]: naive_np_sec = timeit.timeit('sum(na*na)',setup="import numpy as np; na = np.arange(1000)",number = 10000)
In [5]: good_np_sec = timeit.timeit('na.dot(na)',setup="import numpy as np; na = np.arange(1000)", number = 10000)
In [6]: print("Normal Python: %f sec"%normal_py_sec)
Normal Python: 1.874073 sec
In [7]: print("Naive Numpy: %f sec"%naive_np_sec)
Naive Numpy: 6.491387 sec
In [8]: print("Good Numpy: %f sec"%good_np_sec)
Good Numpy: 0.094852 sec

Nếu sử dụng Python, thời gian xử lý là 1,874073 giây.

Nếu sử dụng NumPy với vai trò là thành phần lưu trữ dữ liệu (Naïve NumPy), thì thời gian xử lý là 6,491387 giây, chậm hơn 3,5 lần so với sử dụng Python.

Nếu sử dụng hàm dot() của Numpy, đây là hàm đã được tối ưu của NumPy, thì thời gian xử lý là 0,094852 giây, nhanh hơn 20 lần so với sử dụng Python.

Vì vậy, trong một số trường hợp, nên sử dụng các hàm đã được tối ưu trong NumPy hoặc SciPy để tăng tốc độ xử lý của hệ thống.

Tuy nhiên, kiểu dữ liệu mảng (array) trong NumPy lại không linh hoạt bằng kiểu dữ liệu danh sách (list) trong Python. Mảng trong NumPy chỉ chứa được một kiểu dữ liệu, trong khi danh sách trong Python có thể chứa nhiều kiểu dữ liệu.

In [9]: a = np.array([1,2,3])
In [10]: a.dtype
Out[10]: dtype('int32')

Nếu có nhiều kiểu dữ liệu trong mảng, NumPy sẽ cố gắng chuyển tất cả về một kiểu dữ liệu hợp lý nhất. Ví dụ:

In [11]: import numpy as np
In [12]: np.array([1,"string"])
Out[12]:
array(['1', 'string'], dtype='|S6')

Số 1 đã được chuyển thành kiểu kí tự ‘1’.

In [13]: np.array([1, "stringy", set([1,2,3])])
Out[13]: array([1, 'stringy', set([1, 2, 3])], dtype=object)

Số 1 và chuỗi ‘stringy’ đã được chuyển thành kiểu đối tượng (object).

 

Làm quen với SciPy


SciPy cung cấp các giải thuật hiệu quả trên kiểu dữ liệu mảng của NumPy.

SciPy hỗ trợ các tính toán liên quan đến: tính toán trên ma trận, đại số tuyến tính, tối ưu, clustering, spatial operation, biến đổi Fast Fourier.

Có thể sử dụng tất cả các chức năng của NumPy thông qua SciPy.

Bảng sau là các gói SciPy phổ biến:

Gói SciPy
Chức năng
Cluster

Constants

Fftpack

Integrate

Interpolate

Io
Nhập, xuất dữ liệu
Linalg

Maxentropy

Ndimage

Odr

Optimize

Signal

Sparse

Spatial

Special

Stats
Bộ công cụ về thống kê

 

Ứng dụng máy học đầu tiên


Giả sử bạn có một website bán hàng, bạn đã thiết lập hạ tầng để có thể đáp ứng số lượng truy cập là 100 000 lần/giờ.

Để theo dõi tình trạng hoạt động của hệ thống, bạn thực hiện đếm và ghi lại số lần truy cập website theo từng giờ.

Dựa vào thông tin theo dõi, bạn sẽ phải dự báo khi nào thì số lượng truy cập sẽ chạm ngưỡng 100 000 lần/giờ? hay dự báo khi nào sẽ phải nâng cấp hệ thống?

 

Đọc dữ liệu


Dữ liệu theo dõi số lần truy cập theo từng giờ được lưu trong tập tin dạng .tsv.

TSV (tab-separated values): là tập tin dạng văn bản, được sử dụng để lưu dữ liệu có cấu trúc bảng, trong đó mỗi hàng của bảng được lưu trên một dòng, mỗi trường dữ liệu trên một dòng được ngăn cách bởi một khoảng tab (hay kí tự tab).


Bấm Ctrl + A để chọn toàn bộ dữ liệu, bấm Ctrl + C để copy dữ liệu, mở chương trình Notepad, bấm Ctrl + V để dán dữ liệu vào Notepad.

Bấm vào mục File của Notepad, chọn Save, tại mục File name nhập tên cho tập tin, nhớ để tất cả trong dấu nháy kép, ví dụ “web_traffic.tsv”.

Một phần của tập tin dữ liệu web_traffic.tsv được thể hiện ở hình sau:



Dữ liệu gồm hai cột, cột đầu tiên là giờ, cột thứ hai là số lượt truy cập tương ứng. Tất cả gồm 743 hàng.

Sử dụng hàm genfromtxt () của SciPy để đọc dữ liệu.

In [1]: import scipy as sp
In [2]: data = sp.genfromtxt("D:\Liv\Re\Ebooks\ML\web_traffic.tsv", delimiter="\t")

Xuất thử dữ liệu để kiểm tra, ví dụ xuất 10 hàng đầu tiên.

In [3]: print(data[:10])
[[ 1.00000000e+00 2.27200000e+03]
[ 2.00000000e+00 nan]
[ 3.00000000e+00 1.38600000e+03]
[ 4.00000000e+00 1.36500000e+03]
[ 5.00000000e+00 1.48800000e+03]
[ 6.00000000e+00 1.33700000e+03]
[ 7.00000000e+00 1.88300000e+03]
[ 8.00000000e+00 2.28300000e+03]
[ 9.00000000e+00 1.33500000e+03]
[ 1.00000000e+01 1.02500000e+03]]

Xem định dạng dữ liệu:

In [4]: print (data.shape)

(743, 2)
Dữ liệu gồm 743 hàng, 2 cột.

 

Tiền xử lý và làm sạch dữ liệu


Để tiện xử lý trên SciPy, tạo hai vector ứng với hai chiều của dữ liệu, mỗi vector có kích thước 743. Vector x ứng với số giờ, và vector y ứng với số lần truy cập/giờ tương ứng.
In [5]: x = data[:,0]
In [6]: y = data[:,1]
Quan sát giá trị của y, sẽ thấy có một số giá trị không hợp lệ, chứa giá trị “nan”.
Tổng số giá trị không hợp lệ của y là: 8
In [7]: sp.sum(sp.isnan(y))
Out[7]: 8
Loại bỏ các hàng chứa giá trị không hợp lệ, cụ thể sẽ bỏ đi 8 hàng trong tổng số 743 hàng.
In [8]: x = x[~sp.isnan(y)]
In [9]: y = y[~sp.isnan(y)]
Biểu diễn dữ liệu dưới dạng đồ thị không gian hai chiều.
Sử dụng gói pyplot của Matplotlib.
In [11]: import matplotlib.pyplot as plt
In [12]: plt.scatter(x,y)
Out[12]: <matplotlib.collections.PathCollection at 0x6ad9df0>
In [13]: plt.title("Luu luong truy cap web")
Out[13]: <matplotlib.text.Text at 0x6ab4130>
In [15]: plt.xlabel("Thoi gian")
Out[15]: <matplotlib.text.Text at 0x6a90c70>
In [16]: plt.ylabel("Truy cap/gio")
Out[16]: <matplotlib.text.Text at 0x6a9ac10>
In [20]: plt.xticks([w*7*24 for w in range(5)],['Tuan %i'%(w+1) for w in range(5)])
Out[20]:
([<matplotlib.axis.XTick at 0x6aa3bf0>,
<matplotlib.axis.XTick at 0x6a9aa70>,
<matplotlib.axis.XTick at 0x472f790>,
<matplotlib.axis.XTick at 0x6ad62b0>,
<matplotlib.axis.XTick at 0x6ad65f0>],
<a list of 5 Text xticklabel objects>)
In [22]: plt.autoscale(tight=True)
In [23]: plt.grid()
In [24]: plt.show()
Đồ thị kết quả:
--------------------------
Tham khảo (lược dịch)
Willi Richert, Luis Pedro Coelho, Building Machine Learning Systems with Python, PACKT publishing, 2013
--------------------------
Cập nhật (2015/1/27)
--------------------------
Đọc thêm

Hoc may voi Python (1)




Học máy với Python

 

Chương 1. Tổng quan

 

Mở đầu


Học máy (machine learning) là dạy cho máy tính biết cách tự thực hiện các công việc.

Các vấn đề quan trọng của học máy là: lựa chọn giải thuật phù hợp đối với từng bài toán, cài đặt chương trình và đánh giá kết quả.

Ví dụ đơn giản về học máy: khi sử dụng thư điện tử (email), hàng ngày bạn hay phải phân loại các thư nhận được theo nhóm. Ví dụ, bạn sẽ phân thành các nhóm: gia đình, bạn bè, công việc. Ngày qua ngày, bạn sẽ thấy chán và thấy mất thời gian. Bạn muốn viết một chương trình để máy tính làm công việc này thay cho bạn. Khi viết chương trình, cách tiếp cận mà mọi người hay nghĩ tới là mô phỏng lại quá trình bộ óc của con người đã làm. Cách này khá phức tạp và không hiệu quả. Cách thứ hai là xây dựng một tập dữ liệu gồm các cặp email/nhãn, đây là các email đã được phân loại, dựa trên tập dữ liệu này, chương trình sẽ tìm ra được tập luật, sau đó, máy tính sẽ áp dụng tập luật này để phân loại tự động cho các email mới. Tập dữ liệu ở đây được gọi là dữ liệu huấn luyện (training data).

Máy học có liên quan nhiều đến lĩnh vực thống kê.

Máy học giúp tìm ra các mối liên hệ, những quy luật từ dữ liệu.

Tài liệu này giúp bạn có cái nhìn tổng quan về một số giải thuật đang được sử dụng phổ biến.

Tuy nhiên, bạn cũng nên biết là, việc cài đặt các giải thuật trong học máy để giải quyết một bài toán không phải là tất cả, mà bên cạnh đó, bạn cần phải thực hiện các công việc khác.

Sau đây là các công việc cần phải thực hiện để giải quyết một bài toán:

  1. Đọc và làm sạch dữ liệu đầu vào.
  2. Khảo sát và hiểu dữ liệu đầu vào.
  3. Biểu diễn dữ liệu đầu vào.
  4. Chọn và cài đặt giải thuật.
  5. Đánh giá kết quả.

Đối với dữ liệu đầu vào, các vấn đề bạn hay gặp phải là: dữ liệu có giá trị không hợp lệ, thiếu dữ liệu. Trong một số trường hợp, việc có quá ít dữ liệu hoặc có quá nhiều dữ liệu đều không tốt cho kết quả thực thi.

Dữ liệu cung cấp cho giải thuật thường là dữ liệu đã được tiền xử lý, rất ít giải thuật có thể sử dụng các dữ liệu chưa qua tiền xử lý.

Dữ liệu được tiền xử lý và tổ chức tốt, cộng với một giải thuật đơn giản, vẫn có thể cho ra kết quả tốt hơn rất nhiều so với một giải thuật phức tạp, nhưng chạy trên bộ dữ liệu được tiền xử lý và tổ chức không tốt.

Việc lựa chọn giải thuật phù hợp cho một bài toán là một vấn đề không đơn giản. Trong nhiều tình huống, bạn buộc phải thỏa hiệp giữa thời gian thực thi và độ chính xác của kết quả.

Cuối cùng, việc đánh giá kết quả của giải thuật cũng rất quan trọng.

Để làm các phần thực hành, bạn cần phải cài đặt ngôn ngữ lập trình Python. Để thực hiện các tính toán bạn sẽ sử dụng các gói NumPy (Numeric Python) và SciPy (Scientific Python). Để hiển thị kết quả một cách trực quan, bạn sẽ sử dụng gói Matplotlib.

Enthought Canopy là gói phần mềm có tích hợp sẵn cả Python, Numpy, Scipy, Matplotlib và một số thứ khác.

Vào địa chỉ sau https://store.enthought.com/downloads/ để tải gói Enthought Canopy về máy.

Nhớ lựa chọn phiên bản cho phù hợp với máy tính của bạn. Xem hình bên dưới.



(Tập tin cài đặt trên website là canopy-1.5.1-win-32.msi. Tuy nhiên, khi tôi dùng IDM để tải về máy, thì IDM tự đổi tên tập tin thành canopy-1.5.1-win-32.exe, chạy tập tin này sẽ bị lỗi. Nếu bạn bị tình trạng tương tự, hãy đổi lại đuôi .exe thành .msi là cài đặt được bình thường).

 

Làm quen với NumPy


NumPy là viết tắt của Numeric Python, là một gói chương trình hỗ trợ cho các tính toán khoa học bằng ngôn ngữ lập trình Python.

Xem thêm thông tin về Numpy tại đường dẫn: http://www.numpy.org/

Chạy Enthought Canopy\Code Editor, màn hình kết quả:



Nhập lệnh vào cửa sổ Python.

In [3]: import numpy # nạp gói numpy cho python
In [4]: numpy.version.full_version # xem phiên bản
Out[4]: '1.8.1'

Nạp và đặt lại tên tham chiếu cho gói numpy.

In [7]: import numpy as np

Khai báo mảng a, gồm 6 phần tử, với giá trị của các phần tử là: 0, 1, 2, 3, 4, 5.

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

Xem số chiều của mảng a.

In [10]: a.ndim
Out[10]: 1

Xem dạng biểu diễn của mảng a.

In [12]: a.shape
Out[12]: (6,) # 6 hàng

Tạo ma trận hai chiều b từ mảng dữ liệu một chiều a. Ma trận b gồm 3 hàng, 2 cột. Tuy nhiên, giá trị các phần tử của a và b vẫn duy trì sự đồng bộ, nghĩa là b chưa thực sự là một bản sao độc lập của a. Nếu thay đổi giá trị trong b thì giá trị trong a cũng thay đổi, và ngược lại. Đây là đặc tính của numpy giúp hạn chế việc lặp lại của dữ liệu, giúp tiết kiệm bộ nhớ.

In [13]: b = a.reshape((3,2))
In [14]: b
Out[14]:
array([[0, 1],
           [2, 3],
          [4, 5]])

Xem số chiều và dạng thể hiện của b.

In [15]: b.ndim
Out[15]: 2
In [16]: b.shape
Out[16]: (3, 2)

Thay đổi giá trị một phần tử trong b, ví dụ b[1][0] = 77 (hàng 1, cột 0). Rồi xem kết quả.

In [17]: b[1][0] = 77
In [18]: b
Out[18]:
array([[ 0, 1],
           [77, 3],
          [ 4, 5]])

Xem lại giá trị của a, thấy rằng a cũng bị thay đổi.

In [19]: a
Out[19]: array([ 0, 1, 77, 3, 4, 5])

Để tạo ra ma trận c, là bản sao thực sự độc lập từ a, sử dụng thêm lệnh copy.

In [20]: c = a.reshape((3,2)).copy()
In [21]: c
Out[21]:
array([[ 0, 1],
           [77, 3],
          [ 4, 5]])

Đổi giá trị trong ma trận c, phần tử c[0][0] = -99. Xem kết quả.

In [22]: c[0][0] = -99
In [23]: c
Out[23]:
array([[-99, 1],
           [ 77, 3],
          [ 4, 5]])
In [24]: a
Out[24]: array([ 0, 1, 77, 3, 4, 5])

Numpy cho phép tính toán linh hoạt trên mảng. Ví dụ: nhân tất cả các phần tử của mảng a với 2, hoặc tính bình phương các phần tử.

In [26]: a[2] = 2
In [27]: a
Out[27]: array([0, 1, 2, 3, 4, 5])
In [28]: a*2
Out[28]: array([ 0, 2, 4, 6, 8, 10])
In [29]: a**2
Out[29]: array([ 0, 1, 4, 9, 16, 25])

Chỉ mục trong mảng (indexing)

Cho mảng a gồm 6 phần tử, giá trị của các phần tử là: 1, 2, 87, 3, 4, 5.

In [1]: import numpy as np
In [2]: a = np.array([1,2,87,3,4,5])
In [3]: a
Out[3]: array([ 1, 2, 87, 3, 4, 5])

Để lấy giá trị của một phần tử trong mảng, ta sẽ sử dụng chỉ mục (index) để tham chiếu đến nó.

Ví dụ, muốn lấy giá trị đầu tiên.

In [4]: a[0]
Out[4]: 1

Numpy cho phép sử dụng mảng làm chỉ mục, ví dụ, muốn lấy giá trị của các phần tử thứ 2, 3, 4 trong mảng a, sử dụng lệnh sau.

In [6]: a
Out[6]: array([ 1, 2, 87, 3, 4, 5])
In [7]: a[np.array([2,3,4])]
Out[7]: array([87, 3, 4])

Cho phép so sánh từng phần tử của mảng với một giá trị bất kì.

In [8]: a>4
Out[8]: array([False, False, True, False, False, True], dtype=bool)

Xuất các giá trị trong mảng lớn hơn 4.

In [9]: a[a>4]
Out[9]: array([87, 5])

Thay thế các giá trị vượt ngưỡng bằng một giá trị cụ thể. Ví dụ, thay thế các giá trị lớn hơn 4 của mảng bằng 4.

In [10]: a[a>4] = 4
In [11]: a
Out[11]: array([1, 2, 4, 3, 4, 4])

Có thể sử dụng hàm clip để đưa các giá trị của mảng về một miền cho trước, các giá trị cao hơn hoặc thấp 
hơn ngưỡng sẽ bị thay thế bởi ngưỡng.

In [17]: a
Out[17]: array([1, 2, 4, 3, 4, 4])
In [18]: a.clip(2,3)
Out[18]: array([2, 2, 3, 3, 3, 3])
--------------------------
Tham khảo (lược dịch)
Willi Richert, Luis Pedro Coelho, Building Machine Learning Systems with Python, PACKT publishing, 2013
--------------------------
Cập nhật (2015/1/20)
--------------------------
Đọc thêm