# numpy 数据分析基础

Posted ham-731

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# numpy 数据分析基础相关的知识,希望对你有一定的参考价值。

numpy 数据分析基础

创建数组

方法 说明
np.array( x ) 将输入数据转化为一个ndarray|
np.array( x, dtype ) 将输入数据转化为一个类型为type的ndarray|
np.asarray( array ) 将输入数据转化为一个新的(copy)
np.ones( N ) 生成一个N长度的一维全一ndarray
np.ones( N, dtype) 生成一个N长度类型是dtype的一维全一ndarray
np.ones_like( ndarray ) 生成一个形状与参数相同的全一ndarray
np.zeros( N) 生成一个N长度的一维全零ndarray
np.zeros( N, dtype) 生成一个N长度类型位dtype的一维全零ndarray
np.zeros_like(ndarray) 类似np.ones_like( ndarray )
np.empty( N ) 生成一个N长度的未初始化一维ndarray
np.empty( N, dtype) 生成一个N长度类型是dtype的未初始化一维ndarray
np.empty(ndarray) 类似np.ones_like( ndarray )
np.eye( N ) 创建一个N * N的单位矩阵(对角线为1,其余为0)
np.identity( N )
np.arange( num) 生成一个从0到num-1步数为1的一维ndarray
np.arange( begin, end) 生成一个从begin到end-1步数为1的一维ndarray
np.arange( begin, end, step) 生成一个从begin到end-step的步数为step的一维ndarray
np.mershgrid(ndarray, ndarray,...) 生成一个ndarray * ndarray * ...的多维ndarray
np.where(cond, ndarray1, ndarray2) 根据条件cond,选取ndarray1或者ndarray2,返回一个新的ndarray
np.in1d(ndarray, [x,y,...]) 检查ndarray中的元素是否等于[x,y,...]中的一个,返回bool数组
import numpy as np

array 创建数组


np.array([[1,2],[3,4]])

arr = [1,2,3,4,5,6,7]
a = np.array(arr)
a
array([1, 2, 3, 4, 5, 6, 7])

zeros 创建默认0的数组

a = np.zeros(3)
print ('a:',a)
b = np.zeros((3,3))
print('b:',b)
c = np.zeros_like(a)
print('c:',c)
a: [0. 0. 0.]
b: [[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
c: [0. 0. 0.]

ones 创建默认1的数组

a = np.ones(3)
print ('a:',a)
b = np.ones((3,3))
print('b:',b)
c = np.ones_like(b)
print('c:',c)
a: [1. 1. 1.]
b: [[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
c: [[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]

empty 创建默认值 随机的数组

print (np.empty((2)))
print(np.empty((2,4)))
[-5.73021895e-300  6.92466535e-310]
[[6.92449667e-310 5.02034658e+175 6.03195894e+174 2.73950109e-057]
 [7.12194759e-067 2.10979251e-052 1.47763641e+248 1.16096346e-028]]

random.randn 随机值数组

np.random.randn(6)
array([ 0.84344504, -0.73714262,  0.93808627, -1.00264675, -0.17058495,
        0.4664123 ])

random.randn 随机值多维数组

np.random.randn(2,2)
array([[ 0.38153354, -0.92519611],
       [-1.3137341 , -1.26921917]])

arange 创建序列数组

## arange 0-9
print(np.arange(10))

## arange 5-15
print(np.arange(5,15))

## arange 13579
print(np.arange(1,10,2))
[0 1 2 3 4 5 6 7 8 9]
[ 5  6  7  8  9 10 11 12 13 14]
[1 3 5 7 9]

eye identity 创建对角线为一的多维数组

a = np.eye(4)
print(a)
np.identity(4)
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])
np.eye(3,3,3)
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

reshape 一维转多维

a = np.arange(4).reshape(2,2)
print(a)
[[0 1]
 [2 3]]

meshgrid 生成一个ndarray * ndarray * ...的多维ndarray

x = np.array([0, 1, 2])
y = np.array([0, 1])

X, Y = np.meshgrid(x, y)
print(X)
print(Y)
[[0 1 2]
 [0 1 2]]
[[0 0 0]
 [1 1 1]]

常用方法

ndim 查看数据维度

shape 查看数据维度大小

dtype 查看数据类型

a = np.random.randn(3,3,3)
# 查看数据维度
print(a.ndim)
# 查看数据维度大小
print(a.shape)
# dtype 查看数据类型
print(a.dtype)
3
(3, 3, 3)
float64

astype转换数据类型

a = np.eye(5,5)
print(a.dtype)

b = a.astype(np.int64).dtype
print(b)
float64
int64

数学运算

# +
a = np.arange(4).reshape(2,2)
print(a)
print('++++++++')
print(a+1)
# -
print('--------')
print(a-1)
# *
print('********')
print(a*2)
# /
print('////////')
print(1/(a+1))
[[0 1]
 [2 3]]
++++++++
[[1 2]
 [3 4]]
--------
[[-1  0]
 [ 1  2]]
********
[[0 2]
 [4 6]]
////////
[[1.         0.5       ]
 [0.33333333 0.25      ]]

比较运算

a = np.arange(6,0,-1).reshape(2,3)
b = np.arange(3,9).reshape(2,3)
print(a,b,a>b,sep='
')
[[6 5 4]
 [3 2 1]]
[[3 4 5]
 [6 7 8]]
[[ True  True False]
 [False False False]]

切片和索引

一维切片同py list

a = np.arange(10)
print(a)
print(a[5])
print(a[5:8])
a[5:8] = 12
print(a)
[0 1 2 3 4 5 6 7 8 9]
5
[5 6 7]
[ 0  1  2  3  4 12 12 12  8  9]

切片后不等copy

b = a[5:8]
print(b)
b[1] = 21
print(a)
[12 12 12]
[ 0  1  2  3  4 12 21 12  8  9]
# 切片给数组赋值
a[:] = 0
a
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

copy 复制

# 复制
b = a[2:5].copy()
print(b)
b[:] = 11
print(b)
print(a)
[0 0 0]
[11 11 11]
[0 0 0 0 0 0 0 0 0 0]

多维数组

# 多维数组
a2d = np.arange(6).reshape(2,3)
print(a2d)
# 两种取值方式,结果一样
print(a2d[0][2])
print(a2d[0,2])
[[0 1 2]
 [3 4 5]]
2
2
# 多维数组
a3d = np.arange(1,13).reshape(2,2,3)
print(a3d)
print(a3d.ndim)
print(a3d[0])
print(a3d[0].ndim)
[[[ 1  2  3]
  [ 4  5  6]]

 [[ 7  8  9]
  [10 11 12]]]
3
[[1 2 3]
 [4 5 6]]
2

标量值和数组都可以赋值

# 标量值和数组都可以赋值给 a3d
tmp = a3d[0].copy()
a3d[0] = 99
print(a3d)
a3d[0] = tmp
print(a3d)
[[[99 99 99]
  [99 99 99]]

 [[ 7  8  9]
  [10 11 12]]]
[[[ 1  2  3]
  [ 4  5  6]]

 [[ 7  8  9]
  [10 11 12]]]

多维数组 切片索引

选行

a = np.eye(4)
# 选2 3 行
a[[2,3]]
array([[0., 0., 1., 0.],
       [0., 0., 0., 1.]])

选列

a[:][2]
array([0., 0., 1., 0.])
a2d = np.arange(9).reshape(3,3)
print(a2d)
# 选择前2
print(a2d[:2])
# 选择 0 1 的0
print(a2d[:2,:1])
# 选择0 1 的 1 2
print(a2d[:2,1:])
# 选择 1 的 1 2
print(a2d[1,1:])
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[[0 1 2]
 [3 4 5]]
[[0]
 [3]]
[[1 2]
 [4 5]]
[4 5]
a2d[:2,1:] = 0
a2d
array([[0, 0, 0],
       [3, 0, 0],
       [6, 7, 8]])

布尔型,索引


names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.randn(7,4)
print(names,data,sep='/n')
print(names == 'Bob')
['Bob' 'Joe' 'Will' 'Bob' 'Will' 'Joe' 'Joe']/n[[-0.75689604  0.88583323 -1.49689044  0.95657837]
 [-1.41937221 -0.22434237  1.74661417  0.08943732]
 [ 1.55542971 -1.73335114  0.22718931  0.07517303]
 [ 2.97463647  1.26849374 -0.38591486  0.1239141 ]
 [-1.0057703  -0.26292255  1.42444036 -2.02698881]
 [-0.00814679  0.38637696 -0.49233058 -1.13374044]
 [-1.03599764 -1.3238696  -0.70148144  0.59657573]]
[ True False False  True False False False]
print(data[names == 'Bob'])
print(data[names == 'Bob',2:])
print(data[names == 'Bob',3])
[[-0.75689604  0.88583323 -1.49689044  0.95657837]
 [ 2.97463647  1.26849374 -0.38591486  0.1239141 ]]
[[-1.49689044  0.95657837]
 [-0.38591486  0.1239141 ]]
[0.95657837 0.1239141 ]
print(names != 'Bob')
print(data[~(names == 'Bob')])
print(((names == 'Bob') | (names == 'Will')))
[False  True  True False  True  True  True]
[[-1.41937221 -0.22434237  1.74661417  0.08943732]
 [ 1.55542971 -1.73335114  0.22718931  0.07517303]
 [-1.0057703  -0.26292255  1.42444036 -2.02698881]
 [-0.00814679  0.38637696 -0.49233058 -1.13374044]
 [-1.03599764 -1.3238696  -0.70148144  0.59657573]]
[ True False  True  True  True False False]
data[data<0] = 0
data
array([[0.        , 0.88583323, 0.        , 0.95657837],
       [0.        , 0.        , 1.74661417, 0.08943732],
       [1.55542971, 0.        , 0.22718931, 0.07517303],
       [2.97463647, 1.26849374, 0.        , 0.1239141 ],
       [0.        , 0.        , 1.42444036, 0.        ],
       [0.        , 0.38637696, 0.        , 0.        ],
       [0.        , 0.        , 0.        , 0.59657573]])
data[names != 'Joe'] = 7
data
array([[7.        , 7.        , 7.        , 7.        ],
       [0.        , 0.        , 1.74661417, 0.08943732],
       [7.        , 7.        , 7.        , 7.        ],
       [7.        , 7.        , 7.        , 7.        ],
       [7.        , 7.        , 7.        , 7.        ],
       [0.        , 0.38637696, 0.        , 0.        ],
       [0.        , 0.        , 0.        , 0.59657573]])
a = np.empty((8,4))
for i in range(8):
    a[i] = i
a
array([[0., 0., 0., 0.],
       [1., 1., 1., 1.],
       [2., 2., 2., 2.],
       [3., 3., 3., 3.],
       [4., 4., 4., 4.],
       [5., 5., 5., 5.],
       [6., 6., 6., 6.],
       [7., 7., 7., 7.]])
# 以特定顺序选取子集
print(a[[5,2,1]])
# 以顺序选取列
a[:,2]
[[5. 5. 5. 5.]
 [2. 2. 2. 2.]
 [1. 1. 1. 1.]]





array([0., 1., 2., 3., 4., 5., 6., 7.])
# 负索引
print(a[[-3,-6,-7]])
print(a[[-3,-6,-7],[0,1,2]])
print(a[[-3,-6,-7]][:, [0,1]])
[[5. 5. 5. 5.]
 [2. 2. 2. 2.]
 [1. 1. 1. 1.]]
[5. 2. 1.]
[[5. 5.]
 [2. 2.]
 [1. 1.]]

数组转置和轴对换

a = np.arange(8).reshape((2,4))
print(a)
print(a.T)
[[0 1 2 3]
 [4 5 6 7]]
[[0 4]
 [1 5]
 [2 6]
 [3 7]]

dot计算内积

一维: x0*x1 + y0*y1
二维: arr2[0][0] =  arr0[0][0] * arr1[0][0] + arr0[0][1] * arr1[1][0] (0*0 + 1*1)
           arr2[0][1] =  arr0[0][0] * arr1[0][1] + arr0[0][1] * arr1[1][1] (0*2 + 1*3)
           arr2[1][0] =  arr0[1][0] * arr1[0][0] + arr0[1][1] * arr1[1][0] (2*0 + 3*1)
           arr2[1][1] =  arr0[1][0] * arr1[0][1] + arr0[1][1] * arr1[1][1] (2*2 + 3*3)
a = np.arange(4).reshape((2,2))
print(a)
print(a.T)

print(np.dot(a[0],a[1]))
print(np.dot(a, a.T))
[[0 1]
 [2 3]]
[[0 2]
 [1 3]]
3
[[ 1  3]
 [ 3 13]]

transpose 交换坐标轴

维度 2 2 2 对应 012 相当交换维度

arr = np.arange(12).reshape((2, 2, 3))
print(arr)
arr.transpose((2,1,0))
    [[[ 0  1  2]
      [ 3  4  5]]
    
     [[ 6  7  8]
      [ 9 10 11]]]

    array([[[ 0,  6],
            [ 3,  9]],
    
           [[ 1,  7],
            [ 4, 10]],
    
           [[ 2,  8],
            [ 5, 11]]])
arr = np.arange(9).reshape(3,3)
print(arr)
arr.transpose((1,0))
    [[0 1 2]
     [3 4 5]
     [6 7 8]]
    array([[0, 3, 6],
           [1, 4, 7],
           [2, 5, 8]])

以上是关于# numpy 数据分析基础的主要内容,如果未能解决你的问题,请参考以下文章

python numpy片段

分享《Python数据分析基础教程:NumPy学习指南(第2版)》高清中文PDF+英文PDF+源代码

Python大数据分析学习基础篇——Spyder和Numpy

Python大数据分析学习基础篇——Spyder和Numpy

对数据进行去均值并转换为 numpy 数组

Python基础 | Numpy详细教程