Numpy的屬性及接口(求和/排序/均值/標準差/中位數等)

1. 探索屬性

在做數據分析之前,我們需要了解我們的數據,那麼如何查看數據的屬性,操作如下:

a=np.arange(8)

print(a)						# 打印數組
print(a.ndim)					# 秩 1
print(a.size)					# 整個數組中元素個數8個
print(a.shape)					# 結果 (8,)
print(a.dtype.name)				# 數組中數據的類型 int64
print(type(a))					# 數組類型 <class 'numpy.ndarray'>
print(a.itemsize)				# 數據類型佔用的空間大小 8

2. 探索接口

  • 最大元素,最小元素
a = np.array([[32, 15, 6, 9, 14], 
              [12, 10, 5, 23, 1],
              [2, 16, 13, 40, 37]])

a.min()				# 所有元素中最小的 1
a.max()				# 所有元素中最大的 40

np.min(a,axis=1)	# 按行找,找到每行最小值 array([6, 1, 2])
np.max(a,axis=0)	# 按列找,找到每列最大值 array([32, 16, 13, 40, 37])
  • 找最小大值索引:arr.argmin()np.argmin(arr)

需要注意的是,無論數組是幾維,返回最大最小值的索引都是作爲“一維”數組的索引

a = np.array([[32, 15, 6, 9, 14], 
              [12, 10, 5, 23, 1],
              [2, 16, 13, 40, 37]])

a.argmin()				# 9
np.argmax(a)			# 13
  • 求和,累加

(1)全部元素求和:arr.sum()np.sum(arr)
(2)按行或列求和:arr.sum(axis=0/1)np.sum(arr, axis=0/1)
(3)按行或列累加:arr.cumsum(axis=0/1)np.cumsum(arr, axis=0/1)

a = np.array([[32, 15, 6, 9, 14], 
              [12, 10, 5, 23, 1],
              [2, 16, 13, 40, 37]])

a.sum()						#  235		
np.sum(a)					# 235

a.sum(axis=0)				# 結果爲:array([46, 41, 24, 72, 52])
np.sum(a,axis=1)			# 結果爲:array([ 76,  51, 108])

a.cumsum(axis=0)			# 結果爲:array([[32, 15,  6,  9, 14],[44, 25, 11, 32, 15],[46, 41, 24, 72, 52]])
np.cumsum(a,axis=1)			#  結果爲:array([[ 32,  47,  53,  62,  76],[ 12,  22,  27,  50,  51],[  2,  18,  31,  71, 108]])
  • 求某一條件下數據的數量佔總樣本數量的百分比/概率:np.mean()
# 實際上,就是計算滿足邏輯語句的值的百分比
class_year = np.array([1967, 1949, 2004, 1997, 1953, 1950, 1958, 1974, 1987, 2006, 2013, 1978, 1951, 1998, 1996, 1952, 2005, 2007, 2003, 1955, 1963, 1978, 2001, 2012, 2014, 1948, 1970, 2011, 1962, 1966, 1978, 1988, 2006, 1971, 1994, 1978, 1977, 1960, 2008, 1965, 1990, 2011, 1962, 1995, 2004, 1991, 1952, 2013, 1983, 1955, 1957, 1947, 1994, 1978, 1957, 2016, 1969, 1996, 1958, 1994, 1958, 2008, 1988, 1977, 1991, 1997, 2009, 1976, 1999, 1975, 1949, 1985, 2001, 1952, 1953, 1949, 2015, 2006, 1996, 2015, 2009, 1949, 2004, 2010, 2011, 2001, 1998, 1967, 1994, 1966, 1994, 1986, 1963, 1954, 1963, 1987, 1992, 2008, 1979, 1987])

millennials=np.mean(class_year > 2005)
print(millennials) 				# 0.2 即出生在2005年之後的人佔總人數的20%
  • 求某個百分位上的數值:np.percentile(數組名,百分比)
b = np.array([1, 2, 3, 4, 4, 4, 6, 6, 7,  8, 8])
np.percentile(b, 40)			# 4.00
  • 求平均值:arr.mean()np.mean(arr)np.average(arr)

  • 求方差:np.var(arr)arr.var()

  • 求標準差:np.std(arr)arr.std()

  • 求中位數:np.median(arr)

  • 排序:

(1)np.sort(arr, axis, kind, order)arr.sort():在原數組上進行排序

參數說明:

a. 參數axis:默認值爲1,即以行爲單位從小到大排序
b. 參數kind:默認爲’quicksort’(快速排序)

# 生成一個隨機數組,先行排序,再列排序
a=np.array([[4, 3, 3, 2],
      		[2, 0, 5, 2],
      		[4, 2, 2, 1]])
a.sort()
a.sort(axis=0)

-----------------
# 結果爲:
array([[2, 3, 3, 4],
       [0, 2, 2, 5],
       [1, 2, 2, 4]])
array([[0, 2, 2, 4],
       [1, 2, 2, 4],
       [2, 3, 3, 5]])       
可以看出來,連續的兩個排序操作,後面一個是受到前面一個排序結果的影響;
這就是`np.sort(arr)`和`arr.sort()`的區別:
外部函數 np.sort() 是不會影響到原數組,總是返回一份拷貝;而 .sort() 方法則會更改原數組。

(2)np.argsort()arr.argsort():返回的是數組值從小到大的索引值,均不對原數組更改

a=np.array([[4, 3, 3, 2],
      		[2, 0, 5, 2],
      		[4, 2, 2, 1]])
a.argsort()
np.argsort(a,axis=0)

------------------
# 返回排序索引的結果爲:
array([[3, 1, 2, 0],
       [1, 0, 3, 2],
       [3, 1, 2, 0]])
array([[1, 1, 2, 2],
       [0, 2, 0, 0],
       [2, 0, 1, 1]])       
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章