隨著數據科學的快速發展,numpy成為了Python中最重要的科學計算包之一。numpy提供了諸多強大的功能,例如超快速的數學運算和數組處理。其中,numpy.empty是非常實用的函數之一。
一、numpy.empty概述
numpy.empty(shape, dtype=float, order=’C’)是numpy中的一個函數,它創建一個指定形狀和dtype的新數組,並將其分配給新的內存塊,但是不會初始化數組元素。因此,numpy.empty速度非常快,因為它不需要初始化數組。
numpy.empty創建一個指定形狀和dtype的新數組,並分配內存空間。但是它不會對數組進行初始化,因此數組的元素值是未知的。這是與numpy.zeros和numpy.ones的區別。它們創建一個新數組並初始化為0或1。因此,numpy.empty函數的速度比numpy.zeros或numpy.ones更快。
import numpy as np a = np.empty([3,2], dtype = int) print(a)
輸出結果如下:
array([[811652128, 0], [ 0, 0], [ 0, 0]])
由於未初始化數組元素,因此數組元素的值為未知值。
二、numpy.empty創建多維數組
numpy.empty也可以創建多維數組。
x = np.empty([3,2,2]) print(x)
輸出結果如下:
array([[[ -3.10503618e+231, -3.10503618e+231], [ 2.96439388e-323, 0.00000000e+000]], [[ 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000]], [[ 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000]]])
與二維數組類似,多維數組的元素值也是隨機的。
三、numpy.empty的性能優化
numpy.empty比其他創建數組的函數更快,因為它不需要為數組賦初值。
為了測試numpy.empty與numpy.zeros的性能,我們可以使用Python自帶的timeit模塊。在此之前,我們需要導入模塊。
import timeit setup = "import numpy as np" stmt_numpy_zeros = "np.zeros((1000,1000))" stmt_numpy_empty = "np.empty((1000,1000))" print('numpy.zeros:{:.6f}\nnumpy.empty:{:.6f}'.format( timeit.timeit(stmt=stmt_numpy_zeros, setup=setup, number=1000), timeit.timeit(stmt=stmt_numpy_empty, setup=setup, number=1000)))
輸出結果如下:
numpy.zeros:2.918427 numpy.empty:1.536704
可以看到,numpy.empty明顯比numpy.zeros快。
四、numpy.empty的應用
(1)numpy.empty與數組的賦值
numpy.empty可以用於數組的賦值。如果需要在循環中使用numpy數組,numpy.empty會更快。
import numpy as np a = np.empty([2,2], dtype=int) for i in range(2): for j in range(2): a[i][j] = i+j print(a)
輸出結果如下:
array([[0, 1], [1, 2]])
除了可以使用數組索引進行賦值,還可以通過花式索引(fancy indexing)進行賦值。
import numpy as np a = np.empty([3,3], dtype=int) a[1] = [1, 2, 3] a[2] = [4, 5, 6] print(a)
輸出結果如下:
array([[ 0, 1, 1], [ 1, 2, 3], [ 4, 5, 6]])
(2)numpy.empty的數組拼接
numpy.empty可以用於數組的拼接。使用numpy.vstack()和numpy.hstack()函數進行數組拼接。
import numpy as np arr1 = np.empty([3,3], dtype=int) arr2 = np.empty([3,3], dtype=int) arr1[:] = 1 arr2[:] = 2 print(arr1) print(arr2) res1 = np.vstack((arr1, arr2)) res2 = np.hstack((arr1, arr2)) print(res1) print(res2)
輸出結果如下:
array([[1, 1, 1], [1, 1, 1], [1, 1, 1]]) array([[2, 2, 2], [2, 2, 2], [2, 2, 2]]) array([[1, 1, 1], [1, 1, 1], [1, 1, 1], [2, 2, 2], [2, 2, 2], [2, 2, 2]]) array([[1, 1, 1, 2, 2, 2], [1, 1, 1, 2, 2, 2], [1, 1, 1, 2, 2, 2]])
(3)numpy.empty的數組轉置
numpy.empty可以用於數組的轉置。使用numpy.transpose()函數進行數組的轉置運算。
arr = np.empty([3,3], dtype=int) arr[:] = 1 print(arr) res = np.transpose(arr) print(res)
輸出結果如下:
array([[1, 1, 1], [1, 1, 1], [1, 1, 1]]) array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])
總結
numpy.empty是numpy中非常實用的函數之一。它創建一個指定形狀和dtype的新數組,並將其分配給新的內存塊,但是不會初始化數組元素。因此,numpy.empty速度非常快,因為它不需要初始化數組。
numpy.empty不會為數組元素進行初始化,數組元素的值為未知值。可以使用數組索引或花式索引對數組元素進行賦值。還可以通過numpy.vstack()和numpy.hstack()函數進行數組的拼接,也可以使用numpy.transpose()函數進行數組的轉置運算。在循環中使用numpy.empty會更快。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/246350.html