NumPy基础:多维数组对象
- 创建ndarray
- array:将输入数据转换为ndarry
- arange:类似于range,返回一个ndarray
- ones、ones_like:根据指定形状和dtype创建一个全1数组。ones_like以另一个数组为参照,根据其形状和dtype创建一个全1数组
- zeros、zeros_like:根据指定形状和dtype创建一个全0数组。zeros_like以另一个数组为参照,根据其形状和dtype创建一个全0数组
- empty、empty_like:创建新数组,只分配内存空间但不填充任何值
- eye、identity:创建一个正方的N*N单位矩阵(对角线为1,其余为0)
import numpy as np data1 = np.array([1,9,8,8,0,4,1,6]) print(data1) ''' [1 9 8 8 0 4 1 6] ''' data2 = np.array([[1,2,3],[4,5,6]]) print(data2) ''' [[1 2 3] [4 5 6]] ''' data3 = np.arange(10) print(data3) ''' [0 1 2 3 4 5 6 7 8 9] ''' data4 = np.ones(3) print(data4) ''' [1. 1. 1.] ''' data_like = [[1,2,3],[4,5,6]] data5 = np.ones_like(data_like) print(data5) ''' [[1 1 1] [1 1 1]] ''' data4 = np.ones(3) print(data4) ''' [1. 1. 1.] ''' data6 = np.zeros(3) print(data6) ''' [0. 0. 0.] ''' data_like = [[1,2,3],[4,5,6]] data7 = np.zeros_like(data_like) print(data7) ''' [[0 0 0] [0 0 0]] ''' data8 = np.empty(3) print(data8) ''' [4.24399158e-314 8.48798317e-314 1.27319747e-313] ''' data9 = np.eye(3) print(data9) ''' [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] '''
- ndarray的数据类型
import numpy as np # np.array 会尝试为新建的数组推断一个较为合适的数据类型 arr1 = np.array([1,2,3]) print(arr1.dtype) ''' int32 ''' # 可使用dtype数据类型 arr2 = np.array([1,2,3],dtype=np.float) print(arr2.dtype) ''' float64 ''' arr3 = np.array([1.1,2,3]) print(arr3.dtype) ''' float64 ''' arr4 = np.array([1.1,2,3],dtype=np.int32) print(arr4.dtype) ''' int32 ''' # 通过astype方法可转换dtype # 调用astype会创建出一个新数组(原始数据的一份拷贝) arr5 = np.array([1,2,3]) float_arr = arr5.astype(np.float64) print(float_arr.dtype) ''' float64 ''' # 注意:如果浮点数转换为整数,则小数部分将会被截断 arr6 = np.array([1.2,2,3]) int_arr = arr6.astype(np.int32) print(int_arr.dtype) ''' int32 ''' print(int_arr) ''' [1 2 3] '''
- 数组和标量之间的运算
import numpy as np arr = np.array([[1,2,3],[4,5,6]]) print(arr+arr) ''' [[ 2 4 6] [ 8 10 12]] ''' print(arr-arr) ''' [[0 0 0] [0 0 0]] ''' print(arr*arr) ''' [[ 1 4 9] [16 25 36]] ''' print(arr/arr) ''' [[1. 1. 1.] [1. 1. 1.]] ''' print(arr**arr) ''' [[ 1 4 27] [ 256 3125 46656]] ''' print(arr+1) ''' [[2 3 4] [5 6 7]] '''
- 基本的索引和切片
import numpy as np # 一维数组 arr = np.arange(10) print(arr) ''' [0 1 2 3 4 5 6 7 8 9] ''' print(arr[5]) ''' 5 ''' print(arr[5:8]) ''' [5 6 7] ''' # 当你将一个标量赋值给一个切片时,该值会自动传播到整个选区 arr[5:8] = 12 print(arr) ''' [ 0 1 2 3 4 12 12 12 8 9] ''' # 数组切片是原始数据视图。这意味着数据不会被复制,任何修改直接反应到源数组上 arr_slice = arr[5:8] arr_slice[1] = 12345 print(arr) ''' [ 0 1 2 3 4 12 12345 12 8 9] ''' arr_slice[:] = 64 print(arr) ''' [ 0 1 2 3 4 64 64 64 8 9] ''' # 二维数组 arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(arr2d) ''' [[1 2 3] [4 5 6] [7 8 9]] ''' print(arr2d[2]) ''' [7 8 9] ''' print(arr2d[0][2]) ''' 3 ''' print(arr2d[0,2]) ''' 3 ''' # 多维数组 arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]) print(arr3d) ''' [[[ 1 2 3] [ 4 5 6]] [[ 7 8 9] [10 11 12]]] ''' print(arr3d[0]) ''' [[1 2 3] [4 5 6]] ''' old_values = arr3d[0].copy() arr3d[0] = 42 print(arr3d) ''' [[[42 42 42] [42 42 42]] [[ 7 8 9] [10 11 12]]] ''' arr3d[0] = old_values print(arr3d) ''' [[[ 1 2 3] [ 4 5 6]] [[ 7 8 9] [10 11 12]]] ''' print(arr3d[1,0]) ''' [7 8 9] '''
- 切片索引
import numpy as np # 一维数组 arr = np.arange(10) print(arr[1:6]) ''' [1 2 3 4 5] ''' # 二维数组 arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(arr2d[:2]) ''' [[1 2 3] [4 5 6]] ''' print(arr2d[:2,1:]) ''' [[2 3] [5 6]] ''' # 索引与切片混合 print(arr2d[1,:2]) ''' [4 5] ''' # 只有冒号表示选区整个轴 print(arr2d[:,:2]) ''' [[1 2] [4 5] [7 8]] ''' # 对切片赋值也会扩散到整个选区 arr2d[:,:2]=0 print(arr2d) ''' [[0 0 3] [0 0 6] [0 0 9]] '''
- 布尔型索引
import numpy as np from numpy.matlib import randn names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe']) # 等于 print(names=="Bob") ''' [ True False False True False False False] ''' # 不等于 print(names!="Bob") ''' [False True True False True True True] ''' # 组合多个条件使用&、| print((names=="Bob")|(names=="Will")) ''' [ True False True True True False False] ''' data = randn(7,3) print(data) ''' [[ 0.35234481 0.68539956 0.2206396 ] [-1.3719165 -0.42694698 1.28509104] [-0.95479498 -0.65378008 -0.1673056 ] [-1.79677508 0.18923784 1.67064335] [-1.24383276 -0.50056086 -0.7917794 ] [-0.92646918 0.47489349 -0.62463223] [ 0.0995606 -1.20420049 -1.55692415]] ''' mask =(names=="Bob") # 0和3为Ture,取0和3行 print(data[mask]) ''' [[ 0.35234481 0.68539956 0.2206396 ] [-1.79677508 0.18923784 1.67064335]] ''' # mask =(names=="Bob")|(names=="Will") # 0、2、3、4为Ture,取这4行 print(data[mask]) ''' [[ 0.35234481 0.68539956 0.2206396 ] [-0.95479498 -0.65378008 -0.1673056 ] [-1.79677508 0.18923784 1.67064335] [-1.24383276 -0.50056086 -0.7917794 ]] ''' # 将data中负值置为0 data[data<0] = 0 print(data) ''' [[0.35234481 0.68539956 0.2206396 ] [0. 0. 1.28509104] [0. 0. 0. ] [0. 0.18923784 1.67064335] [0. 0. 0. ] [0. 0.47489349 0. ] [0.0995606 0. 0. ]] ''' # 通过布尔数组设置整条或整列的值 data[names=="Bob"] = 7 print(data) ''' [[7. 7. 7. ] [0. 0.5615304 0. ] [0. 1.05144009 0.04887547] [7. 7. 7. ] [0.5067665 0. 0. ] [2.0465758 0.78871507 0.68937188] [1.58986486 0.86841601 1.46533603]] '''
- 花式索引
import numpy as np # 花式索引:利用整数数组进行索引 ''' arr = np.empty((8,4)) for i in range(8): arr[i] = i ''' arr = np.arange(16).reshape((4,4)) print(arr) ''' [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]] ''' # 为了特定顺序选取行子集,需传入一个用于指定顺序的整数列 print(arr[[1,0,2]]) ''' [[ 4 5 6 7] [ 0 1 2 3] [ 8 9 10 11]] ''' # 传入多个索引 print(arr[[1,0,2],[0,1,2]]) ''' [ 4 1 10] ''' # 使用负数索引将会从末尾开始选行 print(arr[[-3,-2,-1]]) ''' [[ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]] '''
- 数组的转置与轴对换
import numpy as np arr = np.arange(15).reshape((3,5)) print(arr) ''' [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]] ''' print(arr.T) ''' [[ 0 5 10] [ 1 6 11] [ 2 7 12] [ 3 8 13] [ 4 9 14]] ''' # 矩阵内积 print(np.dot(arr.T,arr)) ''' [[125 140 155 170 185] [140 158 176 194 212] [155 176 197 218 239] [170 194 218 242 266] [185 212 239 266 293]] ''' arr2 = np.arange(16).reshape((2,2,4)) print(arr2) ''' [[[ 0 1 2 3] [ 4 5 6 7]] [[ 8 9 10 11] [12 13 14 15]]] ''' print(arr2.transpose((1,0,2))) #行列索引值对换 ''' [[[ 0 1 2 3] [ 8 9 10 11]] [[ 4 5 6 7] [12 13 14 15]]] ''' arr3 = np.arange(16).reshape((2,2,4)) print(arr3) ''' [[[ 0 1 2 3] [ 4 5 6 7]] [[ 8 9 10 11] [12 13 14 15]]] ''' print(arr3.swapaxes(1,2)) ''' [[[ 0 4] [ 1 5] [ 2 6] [ 3 7]] [[ 8 12] [ 9 13] [10 14] [11 15]]] '''
本文来自博客园,作者:OTAKU_nicole,转载请注明原文链接:https://www.cnblogs.com/nicole-zhang/p/12931168.html