Numpy(Numerical Python)
數字化的python
是一個開源的Python科學計算庫,用于快速處理任意次元的數組。
快速的原因:
1st:記憶體塊風格:ndarray中的所有元素的類型都是相同的,是以ndarray在存儲元素時記憶體可以連續
2nd:ndarray支援并行化運算(向量化運算)
3rd: 效率遠高于純Python代碼
Numpy底層使用C語言編寫,内部解除了GIL(全局解釋器鎖),其對數組的操作速度不受Python解釋器的限制,是以,其效率遠高于純Python代碼。
1-array和asarray的差別
array數組
eg1:
import numpy as np
data1=[[2, 2, 2], [1, 1, 1], [0, 0, 0]]
arr2 = np.array(data1)
arr3 = np.asarray(data1)
print(arr2)
print(type(arr2))
print(arr3)
print(type(arr3))
---------------------------------------------
[[2 2 2]
[1 1 1]
[0 0 0]]
<class 'numpy.ndarray'>
[[2 2 2]
[1 1 1]
[0 0 0]]
<class 'numpy.ndarray'>
這裡看到結果相同,都對複制中繼資料
eg2:
arr = np.ones((3, 3))
arr0 = np.array(arr)
# 相當于索引的形式,并沒有真正的建立一個新的
arr1 = np.asarray(arr)
arr[1] = 333
print(arr0)
print(type(arr0))
print(arr1)
print(type(arr1))
--------------------------------------------
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
<class 'numpy.ndarray'>
[[ 1. 1. 1.]
[333. 333. 333.]
[ 1. 1. 1.]]
<class 'numpy.ndarray'>
随着對中繼資料更改,asarray的資料随之改變
二者定義
np.asarray
def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
np.array
def array(a, dtype=None, order=None):
return array(a, dtype, copy=True, order=order)
np.array(預設情況下)将會copy該對象
2-ndarray的形狀
# 建立不同形狀的數組
a = np.array([[1,2,3],[4,5,6]])
b = np.array([1,2,3,4])
c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
print(a.shape)
print(b.shape)
print(c.shape)
-------------------------------------------------
(2, 3) # 二維數組
(4,) # 一維數組
(2, 2, 3) # 三維數組
3-記得有一道面試題如下:
問題:利用numpy随機初始化正太分布數組或者一個二維矩陣,并 一句代碼找出矩陣中大于1的位置
這裡用的正太分布np.random.normal(loc=0.0, scale=1.0, size=None)
loc:float 此機率分布的均值(對應着整個分布的中心centre)
scale:float 此機率分布的标準差(對應于分布的寬度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints 輸出的shape,預設為None,隻輸出一個值
import numpy as np
array = np.random.normal(4, 4, (2, 2))
print(array)
print(array.shape)
array_ = array[array > 1]
print(array_)
array_0 = array[np.where(array>1)]
# *******還不知清楚是不是where的運作效率更好*******
print(array_0)
------------------------------------------------------
[[ 5.58765753 8.60368122]
[ 6.05855259 -3.56926281]]
(2, 2)
[5.58765753 8.60368122 6.05855259]
[5.58765753 8.60368122 6.05855259]
一句代碼帶入就可以了,目前我覺得這樣可以解決